好奇。
如果我在self::$session = $reg->get('session');
类中指定__construct
,该变量是否可以像$this->session = $reg->get('session');
一样用作类的属性?
我不知道如何测试这个。我可以测试这个的唯一方法是通过改变它们来使我的整个框架处于毁灭状态。
答案 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
实例共享。
由于这种差异,它们不能互换使用,您必须根据您的功能设计做出决定。