Verständnisproblem Lamdafunktionen PHP 5.3
Bimbo
- php
0 dedlfix
Ich habe aktuell ein Verständnisproblem mit den Lamdafunktionen ab PHP 5.3.
Wieso funktioniert denn folgendes:
<?
$array = array(0,1,2,3,4,5,6,7,8,9);
$foo = function() use ($array){foreach($array as $v) if($v >= 5) $r[] = $v; return $r;};
foreach($foo() as $var)
echo $var."\n";
?>
Aber dies hier nicht?:
<?
$array = array(0,1,2,3,4,5,6,7,8,9);
foreach(function() use ($array){foreach($array as $v) if($v >= 5) $r[] = $v; return $r;} as $var)
echo $var."\n";
?>
Das wäre also die erste Frage und die zweite: Wenn ich also nun die Funktion erst definiere und in einer Variable speichere um Sie dann mit $foo() aufzurufen, dann kann ich diese doch gleich wie bis PHP 5.2 ganz normal definieren und dann verwenden. So richtig komm ich nicht hinter das Geheimnis. Vielleicht kann mir jemand auf die Sprünge helfen.
Gruß Bimbo
Hi!
Ich habe aktuell ein Verständnisproblem mit den Lamdafunktionen ab PHP 5.3.
Hab ich unter PHP noch nicht probiert, deswegen versuche ich mal mit dem Wissen von anderen Sprachen zu antworten.
Wieso funktioniert denn folgendes:
$foo = function() use ($array){foreach($array as $v) if($v >= 5) $r[] = $v; return $r;};
foreach($foo() as $var)
Aber dies hier nicht?:
foreach(function() use ($array){foreach($array as $v) if($v >= 5) $r[] = $v; return $r;} as $var)
Der Unterschied ist, dass du im ersten Fall die Funktion in $foo aufrufst (), im zweiten Fall sind aber keine Aufrufklammern vorhanden.
Wenn ich also nun die Funktion erst definiere und in einer Variable speichere um Sie dann mit $foo() aufzurufen, dann kann ich diese doch gleich wie bis PHP 5.2 ganz normal definieren und dann verwenden.
Jein. Wenn du flexibel sein willst, kannst du ohne Lambdafunktionen nur den Funktionsnamen als String (oder ein Callback) übergeben, wenn irgendwo eine Funktion zu übergeben ist. Die Funktion muss einen Namen bekommen. Eine anonyme Funktion in einer Variable abzulegen, statt sie direkt zu verwenden, würde ich vermutlich in Fällen wie den folgenden tun: Die Funktion braucht keinen Namen, weil sie nur lokal benötigt wird, dort aber mehr als einmal. Die Inline-Schreibweise ist zu lang und sprengt die Zeile und/oder fordert den Leser beim Verstehen über Gebühr.
Lo!