¡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 vinculadas no están explícitamente definidas, eso es lo que "usa" es para php.
hay mejores ejemplos del mundo real que el anterior. digamos 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 atm instalado), pero debe parecerse a algo así.
hay una desventaja: muchos desarrolladores de PHP pueden estar un poco indefensos si los enfrenta con cierres.
para entender la calidad de los cierres más, le daré otro ejemplo - esta vez en javascript. uno de los problemas es el alcance y la asincronía inherente del navegador. especialmente, si se trata de window.setTimeout();
(o -intervalo). por lo tanto, pasas una función a setTimeout, pero realmente no puedes dar ningún parámetro, ¡porque proporcionando 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 anónimas/cierres. los espacios de nombres pueden ser más importantes, pero son mucho menos sexys.
¿SOLAMENTE se usa para cierres? Gracias por su explicación, no sabía la diferencia entre la función anónima y un cierre – SeanDowney
La palabra clave 'use' también se utiliza para [espacios de nombres de alias] (http://php.net/manual/en/language.namespaces.importing .php). Es sorprendente que, más de 3 años después del lanzamiento de PHP 5.3.0, la sintaxis 'function ... use' aún esté oficialmente indocumentada, lo que hace que los cierres sean una característica no documentada. El documento incluso [confunde las funciones anónimas y los cierres] (http://php.net/manual/en/functions.anonymous.php). La única documentación (beta y no oficial) sobre 'use()' que pude encontrar en php.net fue [RFC for closures] (https://wiki.php.net/rfc/closures). Así –
[Cuando cierres de uso de función se implementó en PHP?] (Http://stackoverflow.com/questions/20411631/when-was-function-use-closures-implemented-in-php) supongo que entonces estaba en PHP 5.3 ? ¿Está documentado en el manual de PHP ahora de alguna manera? – rubo77