是否使用与$ this->变量相同的范围分辨率运算符(::)分配变量?

时间:2013-06-02 08:31:15

标签: php class variables

好奇。

如果我在self::$session = $reg->get('session');类中指定__construct,该变量是否可以像$this->session = $reg->get('session');一样用作类的属性?

我不知道如何测试这个。我可以测试这个的唯一方法是通过改变它们来使我的整个框架处于毁灭状态。

2 个答案:

答案 0 :(得分:5)

尝试了一下PHP shell(php -a)上的可能性。

php > class a { public $b; function __construct () { self::$b = 10; } }
php > $o = new a;
PHP Fatal error:  Access to undeclared static property: a::$b in php shell code on line 1

php > class a { public static $b; function __construct () { $this->b = 10; } }
php > $o = new a;
php > print $o->b;
10
php > print a::$b;
php > // outputs nothing (is still NULL)

php > class a { public static $b; function __construct () { self::$b = 10; } }
php > $o = new a;
php > print $o->b;
PHP Notice:  Undefined property: a::$b in php shell code on line 1

php > // doesn't print a value (basically NULL)

我们发现了什么

  • 您不能指定非静态属性,例如静态属性(使用self::...)。
  • 您可以指定静态属性,例如非静态属性。但它会创建一个新的隐式非静态公共属性,而不是更改静态属性的值。
  • 您无法访问静态属性,如非静态属性。

结论

不,您无法在静态和非静态访问和写入之间切换。

答案 1 :(得分:0)

在开始之前,您可以使用在线键盘工具轻松测试,但我觉得实际解释正在发生的事情可能会更好。

我们假设你有这个课程,基于你所描述的:

class MyClass
{
    private static $session;

    public function __construct($reg)
    {
        self::$session = $reg->get('session');
    }
}

表达式self::$session引用一个类变量,该变量在MyClass所有实例之间共享。

让我们将课程改为:

class MyClass
{
    private $session;

    public function __construct($reg)
    {
        $this->session = $reg->get('session');
    }
}

现在,表达式$this->session引用了实例变量,该变量未与任何其他MyClass实例共享。

由于这种差异,它们不能互换使用,您必须根据您的功能设计做出决定。