2014-01-04 5 views
1

Я думаю, это странное поведение, но если это не так, это, безусловно, недостаток функции PHP или, пожалуйста, скажите мне, как я могу это сделать.Возвращаемое значение функции, вызываемой с помощью __call

Это мои коды:

child.php

class child extends father { 
    public $name = "John Borned"; 

    public function __construct($name) { 
     parent::__construct($name); 
    } 

    public function __call($function, $params){ 
     $this->surname = "child call surname"; 
     parent::__call($function, $params); 
     call_user_func_array(array($this, $function),$params); 

    } 

    protected function nameIt($name) { 
     $this->name = $name; 
     return $this->surname; 
    } 
} 

father.php

class father { 

    public $name; 
    public $surname = "Roe"; 

    public function __construct($name) { 
     $this->name = $name; 
    } 

    public function __call($function,$params) { 
     $this->surname = "father call surname"; 
    } 
} 

и dummy.php

include("father.php"); 
include("child.php"); 

$c = new child("Jane"); 
$n = $c->nameIt("Jane"); 

var_dump($n); 

Это проблема: Вторя $this->surname в функции nameIt, и значение «фамилия отца». Ничего страшного. Но var_dump($n); говорит NULL если функция nameIt попытается вернуть $this->surname. Зачем? Почему я не могу вернуть значение с protected function nameIt? Как эта функция может вернуть значение?

PS: Эти классы и их использование - всего лишь мимесис моего реального намерения. Поэтому, пожалуйста, не говорите, что вы многословны.

Спасибо.

ответ

3

Когда вы звоните $n = $c->nameIt("Jane");, вы вызываете child::__call, которые ничего не возвращают. Я думаю, вы должны написать

return call_user_func_array(array($this, $function),$params); 

в вашем child::__call методе

Добавление

ниже в manual нет каких-либо различий между __call и обычными методами, кроме это магический метод, который вызывается вместо частные, защищенные или несуществующие методы класса.

Так что в вашем случае вы можете прочитать код

$n = $c->nameIt("Jane"); 

в

$n = $c->__call('nameIt', 'Jane'); 
+0

Спасибо. Оно работает. Как ни странно. Но мне нужно больше объяснений, чтобы понять, как это работает. – musa

+0

Добавлено несколько слов. Что именно неясно? –

+0

Все ясно. Спасибо @ Ушаков – musa

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