2017-06-14 60 views
1

我需要静态类(对象)来存储全局变量值。我是PHP新手,但我有其他语言的经验,如Java中的OOP概念。在Java中,我可以使静态变量,并可以调用任何我想要的。但如何在PHP中做同样的事情?如何在PHP中创建静态类

我使用CodeIgniter框架之前,我尝试这个我尝试使用会话来存储,但我想用另一种方式像上面。谁能帮我?

我可以这样吗?

static class myClass{ 
public static myVar = ""; 
} 
+0

为什么你写了静态类myClass,我从来没有见过它任何面向对象的语言?如果你想要一个静态属性,它和java一样。 –

+0

可能的重复:https://stackoverflow.com/questions/468642/is-it-possible-to-create-static-classes-in-php-like-in-c – CD001

回答

1

因为你提到了框架Codeigniter和会话的使用,我假设你需要在多个控制器和视图中使用它。 所以我还有另一种方式,它与类的属性有点不同,但比会话更类似(除了更改后的值不会影响另一页)。

So Use Constant

定义它

应用程序>配置> constant.php

页。在该页面中定义了许多常量,使用完全相同的语法可以定义值,并且可以非常方便地将它用于任何位置。

就像如果你定义在constant.php SITE_NAME常数 defined('SITE_NAME') OR define('SITE_NAME', "My Example Site");

之后,你可以在你笨的任何控制器,视图或模型的任何地方使用它,你需要做的仅仅是呼应它

<?php echo SITE_NAME; //only SITE_NAME not $SITE_NAME ?> 

我希望这是你想要的,如果不是对我的误解抱歉。

0

您可以在PHP中使用类似静态的类。但是您没有PHP中的应用程序循环。这意味着你不会在整个应用程序中获得真正的静态(或单例)。

+0

但任何其他方式做类似于笨? – Patrick

+0

我没有使用CodeIgniter的经验,但我会建议使用单身模式。我一直比较喜欢单身人士,即使是在Java中。 –

0

如果您不能实例化一个类,那么它应该是abstract并将其方法定义为static。但是,有人可以将这个类子类化并使其非抽象。如果你不希望这是一种可能性,那么课程应该是abstract final

如果你这样做,你可以用ClassName::methodName()语法直接调用相关类的方法。请记住,像这样写的类不能使用$this,因为它只对一个对象实例有效。如果您需要该类来维护状态,那么您将必须定义一个静态变量,并使用它的语法为self::static::

abstract final class SomeClass 
{ 
    private static $var = ""; 

    public static function setVar($newVal) 
    { 
     self::$var = (string) $newVal; 
    } 

    public static function getVar() 
    { 
     return self::$var; 
    } 
} 

谨慎做这虽然,使用抽象类的字/方法可以很容易导致紧密耦合的代码是坏的原因很多。例如,如果您编写的一个类通过除了从抽象类继承以外的任何其他方式直接调用抽象类的方法,那么将不可能单独测试该类。它总是会要求你的抽象类也成为测试套件的一部分,这意味着要确定测试失败是由测试类中的错误还是由它所依赖的抽象类造成的更难。更重要的是,如果您所依赖的抽象类用作数据源的访问者,那么您在测试期间也将无法模拟该类。 Mocking是验证类的正确性的一种非常强大的方法,而不必依赖于运行类的环境。例如,可以使用兼容对象来模拟数据库访问类,该对象总是从数组中返回相同的数据而不是击中实际的数据库。这意味着你可以保证,当你运行一个测试时,它将运行在一个你可以完全控制的状态下的数据。如果您通过抽象类的方法访问数据库,那么您无法替换测试的数据库,并且突然之间可能会得到一个测试套件,这可能会在您运行测试时取决于数据库的状态而成功或失败。更糟糕的是,如果您的测试涉及写入数据库,那么在运行测试时可能会损坏数据源。