我的代码:
class Test {
private $a = 5;
public function __set($name, $value)
{
// TODO: Implement __set() method.
echo $name . "#" .$value."<br>";
}
public static function do_test(){
$x= new Test();
$x->a=5;
}
}
$x=new Test();
$x->a=3;
Test::do_test();
输出:
a#3
静态do_test()
函数不会调用魔术方法(__set
)。为什么?
谢谢!
答案 0 :(得分:7)
仅当属性不可访问(包括不存在的属性)时才调用魔术方法。您的财产是private
。 Test::do_test
可以访问该private
属性,因为您是从具有相同类的上下文中访问它的。它不必是相同的 instance (即$this
或self
),而只需是相同的 class上下文。即使类与 instance 不同,也可以访问其private
属性。因此,该访问不需要您的魔术方法。