直接呼叫物件屬性閉包
將閉包分配給物件的屬性時,如果不將閉包重新分配給對象,則直接呼叫它可能會遇到困難一個變數。考慮以下範例:
$obj = new stdClass(); $obj->callback = function() { print "HelloWorld!"; };
不幸的是,嘗試呼叫 $obj->callback() 將導致錯誤「致命錯誤:呼叫未定義的方法 stdClass::callback()」。
PHP 7 解
在 PHP 7 中,使用箭頭函數(在 PHP 7.4中引入),您可以直接呼叫指派給物件屬性的閉包,如下所示:
$obj = new StdClass; $obj->fn = function($arg) { return "Hello $arg"; }; echo ($obj->fn)('World');
Closure::call()
對於版本對於版本低於7 的PHP,另一種方法是使用Closure::call() 函數。但是,此方法不適用於 StdClass 實例。
Magic __call 方法
在 PHP 7 之前,一種可行的方法是實作 magic __call 方法,該方法允許攔截呼叫未定義的方法。在以下範例中,使用 __call 實作建立 Foo 類別:
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 主體內呼叫相同的方法來避免無限遞歸。
以上是為什麼在 PHP 中無法直接呼叫物件的閉包屬性,如何修復?的詳細內容。更多資訊請關注PHP中文網其他相關文章!