我正在尝试使用__call
函数在特定操作之前执行指令。
但是当我使用此代码时,我只让__call
工作一次,而我需要为每次run()
调用执行此代码。
如果我在第一个孩子的$second_child->run()
内使用run()
,那么第一个孩子的__call
正在执行。知道为什么吗?
class ParentClass{
protected function run(){}
public function __call($method,$arguments) {
echo "<br/>######Call ". get_called_class()."########<br>";
if(method_exists($this, $method)) {
call_user_func_array(array($this,$method),$arguments);
}
}
}
class first_child extends ParentClass{
protected function run(){
echo "<br>running " . get_called_class();
$x= new second_child;
$x->run();
}
}
class second_child extends ParentClass{
protected function run(){
echo "<br>running " . get_called_class();
}
}
$y= new first_child;
$y->run();
答案 0 :(得分:1)
这是因为second_child
从ParentClass
延伸,引入了run
方法。
正因为如此,first_child
实际上可以在second_child
中调用(重写)受保护的方法,从而绕过魔术方法,只有在不可能直接调用方法时才会调用该方法。
在这种情况下,有可能调用该方法,因为first_child可以访问ParentClass
中引入的受保护方法,并且通过多态,PHP实际上在second_child
中调用了重写方法。 / p>