PHP绑定方法到另一个类

时间:2017-11-07 19:24:16

标签: php php-7

我可以将类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();

1 个答案:

答案 0 :(得分:3)

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

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

这意味着,您有两种方法可以解决您的问题:

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

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