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?

Warum kann ich die Closure-Eigenschaft eines Objekts in PHP nicht direkt aufrufen und wie kann ich das Problem beheben?

DDD
Freigeben: 2024-12-17 18:30:10
Original
357 Leute haben es durchsucht

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

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!";
};
Nach dem Login kopieren

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');
Nach dem Login kopieren

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');
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage