2

只是好奇。

如果我self::$session = $reg->get('session');在一个__construct类中赋值,该变量可以用作类的属性 $this->session = $reg->get('session');吗?

我不知道如何测试这个。我可以对此进行测试的唯一方法是通过全部更改来破坏我的整个框架。

4

2 回答 2

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::...)这样的非静态属性。
  • 您可以像分配非静态属性一样分配静态属性。但它创建了一个新的隐式非静态公共属性,而不是更改静态属性的值。
  • 您不能像访问非静态属性那样访问静态属性。

结论

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

于 2013-06-02T08:46:16.690 回答
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

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

于 2013-06-03T17:07:42.440 回答