繁体   English   中英

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

[英]Is assigning variable with Scope Resolution Operator(::) same as $this->variable?

只是好奇。

如果我分配self::$session = $reg->get('session'); __construct类中,变量可以用作类的属性,就像$this->session = $reg->get('session');

我不知道该如何测试。 我可以测试的唯一方法是通过更改所有框架来破坏整个框架。

只是尝试了一下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::... )之类的非静态属性。
  • 您可以分配静态属性,例如非静态属性。 但是它创建了一个新的隐式非静态公共属性,而不是更改静态属性的值。
  • 您不能访问静态属性,例如非静态属性。

结论

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

在开始之前,您也可以使用在线键盘工具轻松地对此进行测试,但是我认为实际解释发生的情况可能会更好。

让我们基于您所描述的内容来假设您拥有此类:

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 任何其他实例共享。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM