我在想,这是一种奇怪的行为,但如果不是这样,那肯定是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:这些类及其用法只是我真实意图的模仿。所以请不要说你很啰嗦。
感谢。
答案 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();
打印“受保护”