Closures sind wunderbar! Sie lösen viele Probleme, die mit anonymen Funktionen einhergehen, und ermöglichen wirklich eleganten Code (zumindest solange wir über PHP sprechen).
Javascript-Programmierer benutzen ständig Closures, manchmal sogar ohne es zu wissen, weil gebundene Variablen nicht explizit definiert sind - dafür gibt es in php "use".
Es gibt bessere Beispiele aus der Praxis als das obige. Nehmen wir an, Sie müssen ein mehrdimensionales Array nach einem Unterwert sortieren, aber der Schlüssel ändert sich.
<?php
function generateComparisonFunctionForKey($key) {
return function ($left, $right) use ($key) {
if ($left[$key] == $right[$key])
return 0;
else
return ($left[$key] < $right[$key]) ? -1 : 1;
};
}
$myArray = array(
array('name' => 'Alex', 'age' => 70),
array('name' => 'Enrico', 'age' => 25)
);
$sortByName = generateComparisonFunctionForKey('name');
$sortByAge = generateComparisonFunctionForKey('age');
usort($myArray, $sortByName);
usort($myArray, $sortByAge);
?>
warnung: ungetesteter code (ich habe php5.3 nicht installiert), aber es sollte in etwa so aussehen.
Es gibt einen Nachteil: viele php-Entwickler sind vielleicht etwas hilflos, wenn man sie mit Closures konfrontiert.
um die nettigkeit von closures besser zu verstehen, gebe ich ihnen ein weiteres beispiel - diesmal in javascript. eines der probleme ist das scoping und die dem browser innewohnende asynchronität. besonders, wenn es um window.setTimeout();
(oder -interval). Sie übergeben also eine Funktion an setTimeout, können aber keine Parameter angeben, da die Angabe von Parametern den Code ausführt!
function getFunctionTextInASecond(value) {
return function () {
document.getElementsByName('body')[0].innerHTML = value; // "value" is the bound variable!
}
}
var textToDisplay = prompt('text to show in a second', 'foo bar');
// this returns a function that sets the bodys innerHTML to the prompted value
var myFunction = getFunctionTextInASecond(textToDisplay);
window.setTimeout(myFunction, 1000);
myFunction gibt eine Funktion mit einer Art vordefiniertem Parameter zurück!
Um ehrlich zu sein, mag ich php seit 5.3 und anonymen Funktionen/Verschlüssen viel mehr. namespaces sind vielleicht wichtiger, aber sie sind viel weniger sexy .