调用函数不适用于所有子类

时间:2014-03-07 21:56:52

标签: php oop call

我正在尝试使用__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();

1 个答案:

答案 0 :(得分:1)

这是因为second_childParentClass延伸,引入了run方法。

正因为如此,first_child实际上可以在second_child中调用(重写)受保护的方法,从而绕过魔术方法,只有在不可能直接调用方法时才会调用该方法。

在这种情况下,有可能调用该方法,因为first_child可以访问ParentClass中引入的受保护方法,并且通过多态,PHP实际上在second_child中调用了重写方法。 / p>