我需要創建匿名物件并呼叫它的方法
$obj = new stdClass();
$obj->Greeting = function (string $d){return "Hello ".$d;};
$greetings = $obj->Greeting("world!");
但是當我嘗試執行此代碼時出現錯誤
Call to undefined method stdClass::Greeting()
怎么了?
uj5u.com熱心網友回復:
您創建了一個 stdClass 物件,而不是匿名物件:
$obj = new class () {
public function Greeting(string $d)
{
return "Hello $d";
}
};
echo $greetings = $obj->Greeting("world!");
輸出:
Hello world!
怎么了?
沒什么,讓我們問問,這背后發生了什么或發生了什么?
stdClass 用于 PHP 中的“空”物件或將陣列轉換為物件 ( $obj = (object) ['hello' => 'world']) 時。
默認情況下,它沒有屬性(如 in $obj = new stdClass;),也沒有方法。就這兩者而言,它都是空的。
屬性可以動態添加到stdClass物件 - 但不是函式,因為在實體化物件之前必須在 PHP 中宣告類方法。
因此,在您的情況下,函式是一個屬性(PHP 在這里有兩個包:一個用于屬性,一個用于函式)而不是動態添加到其中的新方法 ( class MyClass { function method() {...} })。
再和原來的例子對比一下,再次引發錯誤:
$obj = new stdClass();
$obj->Greeting = function (string $d) {
return "Hello $d";
};
$greetings = $obj->Greeting("world!");
PHP Fatal error: Uncaught Error: Call to undefined method stdClass::Greeting()
然而:
echo $greetings = ($obj->Greeting)("world!");
# #
作業,輸出:
Hello world!
因為 PHP 現在被引導到($obj->Greeting)間接“呼叫”屬性,所以不先尋找stdClass::Greeting方法。
通常你不想要這種間接性,因此建議改用匿名類。
uj5u.com熱心網友回復:
改變
$obj->Greeting("world!");
到
($obj->Greeting)("world!");
或使用 call_user_func() :
call_user_func($obj->Greeting, 'world!')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/351206.html
