2014-03-07 4 views
1

Я пытаюсь использовать функцию __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

Мой вывод вашего скрипта: ###### Вызов first_child ######## работает first_child работает second_child, как 'Run()' 's становятся казнены – Ray

+0

@Ray: Но оба '__call' не являются. –

ответ

1

Это потому, что second_child простирается от ParentClass, который вводит метод run.

Из-за этого first_child может фактически называть (переопределенный) защищенный метод в second_child, тем самым обходя магический метод, который вызывается только тогда, когда нет возможности прямого вызова метода.

В этом случае существует возможность вызова метода, поскольку first_child имеет доступ к защищенным методам, введенным в ParentClass, а через полиморфизм PHP на самом деле вызывает переопределенный метод в second_child.

+0

'second_child расширяет ParentClass' –

+0

@RocketHazmat Да, это так. Но 'run' уже объявлен в' ParentClass'. Таким же образом применяется тот же ответ. Однако я исправлю это. – GolezTrol

+0

Вывод: '###### Вызов first_child ######## running first_child, выполняющий second_child'. Функция '__call' * вызывается, но только для' first_child', а не 'second_child', почему? –

Смежные вопросы