首頁 >後端開發 >php教程 >如何正確呼叫 PHP 中指派給物件屬性的閉包?

如何正確呼叫 PHP 中指派給物件屬性的閉包?

DDD
DDD原創
2024-12-22 11:23:10377瀏覽

How to Correctly Invoke Closures Assigned to Object Properties in PHP?

直接呼叫指派給物件屬性的閉包

將閉包指派給物件的屬性允許開發人員將功能與物件關聯起來。但是,直接存取閉包可能會出現問題。

問題:

當嘗試直接呼叫指派給物件屬性的閉包時,會發生下列錯誤:

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn