直接呼叫指派給物件屬性的閉包
將閉包指派給物件的屬性允許開發人員將功能與物件關聯起來。但是,直接存取閉包可能會出現問題。
問題:
當嘗試直接呼叫指派給物件屬性的閉包時,會發生下列錯誤:
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中文網其他相關文章!