Can i bind method of class Foo to class Bar? And why the code below throws a warning “Cannot bind method Foo::say() to object of class Bar”? With function instead of method code works fine.
P.S. I know about extending) it is not practical question, just want to know is it real to bind non-static method to another class
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();
Code below works fine
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();
Advertisement
Answer
This is currently not supported. If you want to bind a closure to a new object, it must not be a fake closure, or the new object must be compatible with the old one (source).
So, what is a fake closure: A fake closure is a closure created from Closure::fromCallable
.
This means, you have two options to fix your problem:
Bar
must be compatible with the type ofFoo
– so just makeBar
extend fromFoo
, if possible.Use unbound functions, like annonymous, static or functions outside of classes.