fechamentos são lindos! eles resolvem muitos problemas que vêm com funções anônimas e tornam possíveis códigos realmente elegantes (pelo menos enquanto falamos sobre php).
programadores javascript usam fechamentos o tempo todo, às vezes até sem saber, porque as variáveis vinculadas não são explicitamente definidas - é para isso que serve o "uso" no php.
existem melhores exemplos do mundo real do que o anterior. digamos que você precise classificar uma matriz multidimensional por um subvalor, mas a chave muda.
<?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);
?>
aviso: código não testado (eu não tenho o php5.3 instalado no atm), mas deve se parecer com algo assim.
há uma desvantagem: muitos desenvolvedores de php podem ficar um pouco impotentes se você os confrontar com fechamentos.
para entender melhor a boa aparência dos fechamentos, darei outro exemplo - desta vez em javascript. um dos problemas é o escopo e a assincronia inerente ao navegador. especialmente, se for window.setTimeout();
(ou -interval). então, você passa uma função para setTimeout, mas não pode realmente fornecer nenhum parâmetro, porque fornecer parâmetros executa o 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 retorna uma função com um tipo de parâmetro predefinido!
para ser sincero, eu gosto muito mais de php desde 5.3 e funções / fechamentos anônimos. os namespaces podem ser mais importantes, mas são muito menos sexy .