首頁 >後端開發 >php教程 >為什麼在 PHP 中無法直接呼叫物件的閉包屬性,如何修復?

為什麼在 PHP 中無法直接呼叫物件的閉包屬性,如何修復?

DDD
DDD原創
2024-12-17 18:30:10357瀏覽

Why Can't I Directly Call an Object's Closure Property in PHP, and How Can I Fix It?

直接呼叫物件屬性閉包

將閉包分配給物件的屬性時,如果不將閉包重新分配給對象,則直接呼叫它可能會遇到困難一個變數。考慮以下範例:

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

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