gpt4 book ai didi

PHP绑定(bind)方法到另一个类

转载 作者:可可西里 更新时间:2023-11-01 00:55:18 27 4
gpt4 key购买 nike

我可以将 Foo 类的方法绑定(bind)到 Bar 类吗?为什么下面的代码会抛出警告“无法将方法 Foo::say() 绑定(bind)到 Bar 类的对象”?使用函数而不是方法代码可以正常工作。

附言我知道扩展)这不是实际问题,只是想知道将非静态方法绑定(bind)到另一个类是否真实

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

最佳答案

目前不支持。如果要将闭包绑定(bind)到新对象,则它不能是假闭包,或者新对象必须与旧对象兼容(source)。

那么,什么是假闭包:假闭包是从Closure::fromCallable创建的闭包。

这意味着,您有两种选择来解决您的问题:

  1. Bar 必须与 Foo 的类型兼容 - 所以只需制作 Bar如果可能,从 Foo 扩展。

  2. 使用未绑定(bind)函数,例如匿名函数、静态函数或类外函数。

关于PHP绑定(bind)方法到另一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47165930/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com