返回使用__call调用的函数的值

时间:2014-01-04 19:31:26

标签: php oop

我在想,这是一种奇怪的行为,但如果不是这样,那肯定是PHP的不足之处,或者请告诉我该怎么做。

这些是我的代码:

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 );

这就是问题:在nameIt函数中回显$this->surname并且值为“father call surname”。没关系。但var_dump( $n );如果nameIt函数尝试返回NULL,则说$this->surname。为什么?为什么我无法从protected function nameIt返回任何值?该函数如何返回值?

PS:这些类及其用法只是我真实意图的模仿。所以请不要说你很啰嗦。

感谢。

2 个答案:

答案 0 :(得分:4)

当您致电$n = $c->nameIt( "Jane" );时,您正在呼叫child::__call,但不会返回任何内容。我想你应该写

return call_user_func_array( array( $this, $function ),$params );
您的child::__call方法

中的

<强>加成

manual之后,__call和普通方法之间没有任何差异,除了它是一种神奇的方法,而不是私有的,受保护的或不存在的类方法。

因此,在您的情况下,您可以阅读您的代码

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

as

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

答案 1 :(得分:0)

我想这只是关于可见性:

class A
{
    protected function echo() 
    {
        echo "PROTECTED";
    }
    
    public function __call($function, $params)
    {
        echo "Magic Method";
    }
} 
$a = new A();
$a->echo();

打印“魔术方法”, 而:

class A
{
    public function echo() 
    {
        echo "PROTECTED";
    }
    
    public function __call($function, $params)
    {
        echo "Magic Method";
    }
} 
$a = new A();
$a->echo();

打印“受保护”