Direktes Aufrufen von Abschlüssen, die Objekteigenschaften zugewiesen sind
Durch das Zuweisen eines Abschlusses zu einer Objekteigenschaft können Entwickler dem Objekt Funktionalität zuordnen. Der direkte Zugriff auf den Abschluss kann jedoch problematisch sein.
Das Problem:
Beim Versuch, einen Abschluss, der einer Objekteigenschaft zugewiesen ist, direkt aufzurufen, tritt der folgende Fehler auf:
Fatal error: Call to undefined method stdClass::callback().
Das liegt daran, dass die Eigenschaft als Abschlussobjekt gespeichert wird, das kein __invoke() hat. Methode.
Lösung in PHP 7 und höher:
Ab PHP 7 ist die folgende Syntax verfügbar:
$obj = new stdClass; $obj->fn = function($arg) { return "Hello $arg"; }; echo ($obj->fn)('World');
Alternativ: Closure ::call() kann verwendet werden, funktioniert aber nicht damit StdClass:
Closure::call($obj->callback, ['World']);
Lösung vor PHP 7:
Vor PHP 7 kann die magische Methode __call implementiert werden, um Schließungsaufrufe abzufangen:
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');
Hinweis: Die __call-Methode kann nicht verwendet werden call_user_func_array(array($this, $method), $args), da dies zu einer Endlosschleife führen würde.
Das obige ist der detaillierte Inhalt vonWie rufe ich Objekteigenschaften zugewiesene Abschlüsse in PHP korrekt auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!