21.08.19 2130 Views 5

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.

Falconbyte unterstüzen

Betrieb und Pflege von Falconbyte brauchen viel Zeit und Geld. Um dir auch weiterhin hochwertigen Content anbieten zu können, kannst du uns sehr gerne mit einem kleinen "Trinkgeld" unterstützen.

  • 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 :)

Java lernen

text text

PHP Lernen

zur PHP

JavaScript lernen

move nove move

FALCONBYTE.NET

Handmade with 🖤️

© 2018-2023 Stefan E. Heller

Impressum | Datenschutz | Changelog

Falconbyte Youtube Falconbyte GitHub facebook programmieren lernen twitter programmieren lernen discord programmieren lernen