Verschlüsse sind wunderschön! Sie lösen viele Probleme, die mit anonymen Funktionen einhergehen, und ermöglichen wirklich eleganten Code (zumindest solange wir über PHP sprechen).
Javascript-Programmierer verwenden ständig Closures, manchmal sogar ohne es zu wissen, da gebundene Variablen nicht explizit definiert sind - dafür ist "use" in PHP gedacht.
Es gibt bessere Beispiele aus der Praxis als die oben genannten. Angenommen, 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 atm nicht installiert), aber es sollte ungefähr so aussehen.
Es gibt einen Nachteil: Viele PHP-Entwickler sind möglicherweise etwas hilflos, wenn Sie sie mit Schließungen konfrontieren.
Um die Schönheit von Verschlüssen 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. vor allem, wenn es um window.setTimeout();
(oder -intervall) geht. Sie übergeben also eine Funktion an setTimeout, können jedoch keine Parameter angeben, da die Bereitstellung 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, ich mag PHP seit 5.3 und anonymen Funktionen / Schließungen viel mehr. Namespaces mögen wichtiger sein, aber sie sind viel weniger sexy .