Hallo,
Mich würde mal interessieren, wie Closures in PHP überhaupt Sinn machen. Sie nur zu benutzen, damit es kein OOP-"Mäntelchen" gibt, mag vielleicht eine persönliche Entscheidung für "OOP"-"Hasser" sein, das aber hätte im Wiki hier nix verloren. Es gibt keinen Grund, Dinge zu erklären, die man nur machen kann, weil man sie machen kann. Es muss ja einen Vorteil geben. Bei Javscript mag das zB. die Zuweisung einer Funktion zu einem Eventhandler sein, oder die Erzeugung von privaten, memorisierbaren Variablen. All diese Fälle finde ich bei PHP nicht ...;
Ich kann mir da schon Fälle vorstellen, wo das ganz nützlich sein kann, und zwar immer dann, wenn mit callbacks gearbeitet wird, die aber gleichzeitig Daten aus dem umgebenden Scope benötigen.
Vergleiche z.b. das Beispiel von dieser Seite zum Sortieren eines Arrays nach einem beliebigen Attribut:
<?php
function sortBy(&$items, $key){
if (is_array($items)){
return usort($items, function($a, $b) use ($key){
return strCmp($a[$key], $b[$key]);
});
}
return false;
}
Die Vergleichsfunktion (function($a, $b)) benötigt Daten aus dem umgebenden Scope ($key).
Natürlich kann man das theoretisch auch anders bauen (man könnte z.b. eine eigene Klasse "Sortable" implementieren, der man dann die benötigten Daten bei der Erzeugung mitgibt o.ä.), aber man spart sich Schreibarbeit, weil man dank Lambda/Closure-Ausdrücken den Callback direkt in den Funktionsaufruf von usort schreiben kann. Macht IMO den Code auch lesbarer, denn man sieht jetzt sofort, dass der Callback zum usort-Aufruf gehört.
Viele Grüße,
Jörg