直接调用分配给对象属性的闭包
将闭包分配给对象的属性允许开发人员将功能与对象关联起来。但是,直接访问闭包可能会出现问题。
问题:
当尝试直接调用分配给对象属性的闭包时,会发生以下错误:
Fatal error: Call to undefined method stdClass::callback().
这是因为属性存储为闭包对象,它没有 __invoke()
PHP 7 及以上版本的解决方案:
在 PHP 7 及以上版本中,可以使用以下语法:
$obj = new stdClass; $obj->fn = function($arg) { return "Hello $arg"; }; echo ($obj->fn)('World');
或者,闭包::call() 可以使用,尽管它不能与StdClass:
Closure::call($obj->callback, ['World']);
PHP 7 之前的解决方案:
PHP 7 之前,可以实现 __call 魔术方法来拦截闭包调用:
class Foo { public function __call($method, $args) { if (is_callable(array($this, $method))) { return call_user_func_array($this->$method, $args); } // else throw exception } } $foo = new Foo; $foo->cb = function($who) { return "Hello $who"; }; echo $foo->cb('World');
注意: __call 方法不能使用call_user_func_array(array($this, $method), $args) 因为它会导致无限循环。
以上是如何正确调用 PHP 中分配给对象属性的闭包?的详细内容。更多信息请关注PHP中文网其他相关文章!