Wie greife ich von Lambda-Funktionen auf das übergeordnete Objekt zu?

Lesezeit: 1 Minute

Benutzer-Avatar
Hubro

Ich habe eine rekursive Lambda-Funktion in einem meiner Objekte, und sie muss auf die mysqli-Verbindung des Objekts zugreifen. Dieser Versuch

$recfunc = function($id, $name) use($this) {

Produziert einen unvernünftigen schwerwiegenden Fehler

Schwerwiegender Fehler: $this kann nicht als lexikalische Variable in C:\Users\Codemonkey1991\Desktop\workspace\melior\objects\databasemanager.php in Zeile 88 verwendet werden

Kann mir jemand ein paar Hinweise geben?


Bearbeiten: Nur um den Kontext zu verdeutlichen, versuche ich, diese Lambda-Funktion in einer anderen Funktion zu erstellen.

Da Closures selbst Objekte sind, müssen Sie sie zuweisen $this zu einer lokalen Variablen, wie:

$host = $this;
$recfunc = function($id, $name) use ($host) { ...

  • Hey, nur eine zusätzliche Frage: Wie würde ich vorgehen, damit sich die Funktion selbst aufruft?

    – Hubro

    4. März 2011 um 2:02 Uhr

  • $recfunc = function($id, $name) use ($host, &$recfunc) { if (FOO) return $recfunc($id, $name); }

    – Lange Ohren

    4. März 2011 um 2:09 Uhr


  • Aus der Überprüfung eines bugs.php.net-Berichts zu diesem Fehler geht hervor, dass diese Funktion zu PHP 5.4 hinzugefügt wurde.

    – Paul Dragonis

    25. Mai 2012 um 19:35 Uhr

Benutzer-Avatar
Siphon

Der Verweis auf $this muss nicht explizit an die Lambda-Funktion übergeben werden.

class Foo {
    public $var="";

    public function bar() {
        $func = function() {
            echo $this->var;
        };
        $func();
    }
}

$foo = new Foo();
$foo->var="It works!";
$foo->bar(); // will echo 'It works!'

1187560cookie-checkWie greife ich von Lambda-Funktionen auf das übergeordnete Objekt zu?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy