los cierres son hermosos! resuelven muchos problemas que vienen con funciones anónimas y hacen posible un código realmente elegante (al menos mientras hablemos de php).
los programadores de javascript usan cierres todo el tiempo, a veces incluso sin saberlo, porque las variables enlazadas no están explícitamente definidas, para eso sirve "uso" en php.
Hay mejores ejemplos del mundo real que el anterior. supongamos que tiene que ordenar una matriz multidimensional por un subvalor, pero la clave cambia.
<?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);
?>
advertencia: código no probado (no tengo php5.3 instalado atm), pero debería parecerse a algo así.
Hay un inconveniente: muchos desarrolladores de PHP pueden ser un poco indefensos si los confrontas con cierres.
Para comprender mejor la simplicidad de los cierres, te daré otro ejemplo, esta vez en javascript. Uno de los problemas es el alcance y la asincronía inherente al navegador. especialmente, si se trata de window.setTimeout();
(o -intervalo). entonces, pasa una función a setTimeout, pero realmente no puede dar ningún parámetro, ¡porque proporcionar parámetros ejecuta el código!
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 devuelve una función con un tipo de parámetro predefinido!
para ser honesto, me gusta mucho más php desde 5.3 y funciones / cierres anónimos. Los espacios de nombres pueden ser más importantes, pero son mucho menos sensuales .