我可以将类Foo的方法绑定到类Bar吗?为什么下面的代码会抛出一个警告"无法将方法Foo :: say()绑定到类Bar的对象"?用函数而不是方法代码工作正常。
P.S。我知道扩展)这不是实际问题,只是想知道将非静态方法绑定到另一个类是否真实
class Foo {
public $text = 'Hello World!';
public function say() {
echo $this->text;
}
}
class Bar {
public $text = 'Bye World!';
public function __call($name, $arguments) {
$test = Closure::fromCallable(array(new Foo, 'say'));
$res = Closure::bind($test, $this);
return $res();
}
}
$bar = new Bar();
$bar->say();
以下代码工作正常
function say(){
echo $this->text;
}
class Bar {
public $text = 'Bye World!';
public function __call($name, $arguments) {
$test = Closure::fromCallable('say');
$res = Closure::bind($test, $this);
return $res();
}
}
$bar = new Bar();
$bar->say();
答案 0 :(得分:3)
目前不支持此功能。如果要将闭包绑定到新对象,则它不能是伪闭包,或者新对象必须与旧对象兼容(source)。
那么,什么是假闭包:假闭包是从Closure::fromCallable
创建的闭包。
这意味着,您有两种方法可以解决您的问题:
Bar
必须与Foo
的类型兼容 - 所以只需制作Bar
如果可能,请从Foo
延伸。
使用未绑定的函数,例如匿名,静态或类外的函数。