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