直接呼叫分配給物件屬性的閉包
在PHP 中,指派給物件屬性的閉包在嘗試直接呼叫它們時有限制。如提供的程式碼所示:
$obj = new stdClass(); $obj->callback = function() { print "HelloWorld!"; }; $obj->callback();
此程式碼失敗,並顯示錯誤「致命錯誤:呼叫未定義的方法stdClass::callback()。」為了解決這個問題,PHP 7 引入了直接調用方法。
PHP 7 及以上
在PHP 7 及更高版本中,您可以直接使用調用分配給物件屬性的閉包以下語法:
$obj = new stdClass; $obj->fn = function($arg) { return "Hello $arg"; }; echo ($obj->fn)('World');
Pre-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中文網其他相關文章!