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
DDDOriginal
2024-12-17 18:30:10324Durchsuche

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!";
};

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!

Stellungnahme:
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