kapanışları güzel! onlar anonim fonksiyonları ile gelen sorunları çözmek ve gerçekten zarif kod mümkün kılan (en azından biz php hakkında konuşmak sürece).
javascript programcıları her zaman, bazen bile bilmeden, kapanışları kullanır, çünkü bağlı değişkenler açıkça tanımlanmadı - php "kullanım" için ne olduğunu.
yukarıdakilerden daha iyi gerçek dünya örnekleri var. diyelim ki çok boyutlu bir diziyi bir alt değere göre sıralamanız gerekiyor, ancak anahtar değişiyor.
<?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);
?>
Uyarı: denenmemiş kod (atm yüklü php5.3 yok), ama böyle bir şey gibi görünmelidir.
bir dezavantajı var: php geliştiricileri bir sürü kapanışlarla karşı karşıya kalırsanız biraz çaresiz olabilir.
kapanışların güzel-ty anlamak için, ben size başka bir örnek vereceğim - bu sefer javascript. sorunlardan biri kapsam belirleme ve tarayıcının doğal eşzamansızlığıdır. özellikle, window.setTimeout();
(veya aralıklı) söz konusu olduğunda . Bu nedenle, setTimeout işlevine bir işlev iletirsiniz, ancak parametreler sağlamak kodu yürüttüğü için gerçekten herhangi bir parametre veremezsiniz!
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, bir tür önceden tanımlanmış parametre içeren bir işlev döndürür!
dürüst olmak gerekirse, ben php çok daha 5.3 ve anonim fonksiyonları / kapanışlarını seviyorum. ad alanları daha önemli olabilir, ancak çok daha az seksi olurlar .