Heim >Backend-Entwicklung >PHP-Tutorial >Warum kann ich die Closure-Eigenschaft eines Objekts in PHP nicht direkt aufrufen und wie kann ich das Problem beheben?
Abschluss einer Objekteigenschaft direkt aufrufen
Wenn Sie der Eigenschaft eines Objekts einen Abschluss zuweisen, können Sie auf Schwierigkeiten stoßen, ihn direkt aufzurufen, ohne den Abschluss neu zuzuweisen eine Variable. Betrachten Sie das folgende Beispiel:
$obj = new stdClass(); $obj->callback = function() { print "HelloWorld!"; };
Leider führt der Versuch, $obj->callback() aufzurufen, zu dem Fehler „Schwerwiegender Fehler: Aufruf der undefinierten Methode stdClass::callback()“.
PHP 7-Lösung
In PHP 7 die Verwendung von Pfeilfunktionen (eingeführt in PHP 7.4) können Sie einen Abschluss, der der Eigenschaft eines Objekts zugewiesen ist, wie folgt direkt aufrufen:
$obj = new StdClass; $obj->fn = function($arg) { return "Hello $arg"; }; echo ($obj->fn)('World');
Closure::call()
Für PHP-Versionen unter 7 Eine Alternative besteht darin, die Funktion „Closure::call()“ zu verwenden. Diese Methode ist jedoch nicht auf StdClass-Instanzen anwendbar.
Magische __call-Methode
Vor PHP 7 bestand ein praktikabler Ansatz darin, die magische __call-Methode zu implementieren, die das Abfangen ermöglicht Aufrufe undefinierter Methoden. Im folgenden Beispiel wird eine Foo-Klasse mit einer __call-Implementierung erstellt:
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');
Beachten Sie, dass die __call-Implementierung eine unendliche Rekursion vermeidet, indem verhindert wird, dass dieselbe Methode innerhalb des __call-Körpers aufgerufen wird.
Das obige ist der detaillierte Inhalt vonWarum kann ich die Closure-Eigenschaft eines Objekts in PHP nicht direkt aufrufen und wie kann ich das Problem beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!