我似乎不明白为什么下面的代码只打印两次"TEST"。
<?php
class A {
private $test = "TEST<br />";
public static function getInstance() {
return new self();
}
public static function someStaticMethod() {
$a = new self();
$a->test;
}
public function __get($args) {
echo $this->$args;
}
}
/* echo's "TEST" */
$a = new A();
$a->test;
/* echo's "TEST" */
$a2 = A::getInstance();
$a2->test;
/*
No output... eeerhm... how come?
Why is $a->test (inside someStaticMethod()) not being overloaded by __get ??
*/
A::someStaticMethod();
?>
PHP网站说(链接):
属性重载仅适用于对象上下文。这些神奇的方法不会在静态上下文中触发。因此,不应将这些方法声明为静态方法。从PHP 5.3.0开始,如果其中一个神奇的重载方法被声明为静态,则会发出警告。
但我认为他们试图说你应该声明魔术方法是静态的。例如:
公共静态函数__get(){}
再加上我在对象上下文中使用它的事实$a=新的self();从变量$A中的类A返回一个实例。然后,我使用$a->test(object context imo?)来获取私有的"test"变量,该变量反过来应该重载。。。
我很困惑。。。
来自手册:
重载方法在与尚未声明或在当前作用域中不可见的属性或方法交互时调用
当您调用静态方法someStaticMethod()
时,private$test在当前作用域中可见,因此不会调用magic__get方法。
似乎在A:: someStaticMethod
的上下文中,PHP允许您直接访问私有变量$test
,因此魔术方法没有执行。如果你从那里echo $a->test;
,你会看到它正在被访问。
这是预期的行为,根据PHP手册:
相同类型的对象将可以访问彼此的私有和受保护成员,即使它们不是相同的实例。这是因为在这些对象内部时,特定于实现的细节就已经知道了。