只是好奇。
如果我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
。
由于这种差异,它们不能互换使用,您必须根据您的功能设计做出决定。