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

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

DDD
發布: 2024-12-22 11:23:10
原創
462 人瀏覽過

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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板