Jetzt anmelden...

Login
Passwort
Registrieren
21.08.19 543 Views Kommentare [1] 1 0

credit: ©tonefotografia/ stock.adobe

PHP Blog

Unterschied zwischen Lambda und Closure in PHP

Seit PHP 5.3 stehen im Bereich der Funktionen Lambdas und Closures zur Verfügung. Beides sind anonyme Funktionen. Doch was sind die Unterschiede? Wir zeigen es euch hier.

Download als eBook

  • Lambda-Funktion
  • $user ="Franco";
    // Lambda:
    $v = function(){
        echo "Hallo ". $user; // Kein Zugriff auf $user
    };
    
    $v(); // Hallo
    
  • Closure
  • $user="Franco";
    // Closure:
    $v = function() use ($user){
        echo "Hallo ". $user;
    };
    
    $v(); // Hallo Franco
    

Erklärung

Was sind Lambda-Funktionen?

Lambdas sind anonyme Funktionen, d.h. sie haben keinen Namen.

Wir können Lambda-Funktionen einsetzen, indem wir sie bei der Erstellung einer Variablen zuweisen:

$result = function($x){
    return $x * $x;
};

Über die Variable kann die Funktion dann aufgerufen werden:

echo $result(2); // 4

Besonders nützlich sind Lambdas, wenn wir sie als Callback einsetzen. Das heißt, dass die anonyme Funktion als Argument einer anderen Funktion übergeben wird.

Was sind Closures?

Ein Closure ist einer Lamda-Funktion sehr ähnlich, da es sich auch um eine anonyme Funktion handelt. Aber es gibt einen Unterschied:

  • Ein Closure kann auf ausgewählte Variablen außerhalb ihres Gültigkeitsbereichs (scope) zugreifen. Eine Lambda-Funktion kann dies nicht.

Sehen wir uns eine Lambda Funktion an, die versucht, auf eine Variable außerhalb ihres Gültigkeitsbereichs zuzugreifen:

$x = "Catch me!";

$var = function(){
    echo $x; // Error!
};

Das funktioniert nicht! Die Variable $x liegt außerhalb der Funktion. Deshalb kann die Funktion nicht darauf zugreifen.

Nun ein Closure:

$x = "Catch me!";

$var = function() use($x){
    echo $x; // Catch me!
};

So funktioniert's! Wir können mit dem Closure auch innerhalb einer Funktion auf Variablen von außerhalb zugreifen. Wichtig ist nur, dass wir mit use() mitteilen, welche Variablen wir innerhalb der Funktion nutzen wollen. Mehrere Variablen werden kommasepariert übergeben.

Closures arbeiten pass-by-value

Wenn wir den Wert einer Variable, die außerhalb definiert wurde, innerhalb des Closures ändern, hat dies keinen Effekt auf die Original-Variable:

$x = "Catch me!";

$var = function() use($x){
    $x = "Got you!";
};

$var($x);
echo $x; // Catch me!

Der Grund ist, dass die Variable pass-by-value übergeben wird

Wenn wir innerhalb des Closure die Original-Variable ändern wollen, müssen wir ein &-Zeichen vor die use-Variable schreiben:

$x = "Catch me!";

$var = function() use(&$x){
    $x = "Got you!";
};

$var($x);
echo $x; // Got you!

Wir hoffen, wir konnten Euch bei der Frage nach dem Unterschied zwischen Lambdas und Closures weiterhelfen. Wenn ihr noch Fragen habt oder wenn euch im Artikel etwas aufgefallen ist, lasst es uns in den Kommentaren wissen :)

Falconbyte unterstützen

Kommentar schreiben

Alle Kommentare

Deep51
21.08.2019 - 10:19

Hallo und danke für das Tutorial.
Eine kleine Ergänzung: Wie können den Closure-Effekt auch mit dem Schlüssekwort global innerhalb einer Funktionsdefinition erzielen!!

Schleifen in Java

Schleifenstrukturen gehören zu den wichtigsten Grundlagen in der Programmierung überhaupt.

Vererbung einfach erklärt

Lernen Sie die Grundlagen der Vererbung in Java

Konstruktoren bei Vererbung

Trainieren Sie ihre Konstruktoren-Skills

FALCONBYTE.NET

Handmade with 🖤️

© 2018-2021 Stefan E. Heller

Impressum | Datenschutz

Falconbyte GitHub facebook programmieren lernen twitter programmieren lernen discord programmieren lernen