kapanışları güzel! onlar anonim fonksiyonları ile gelen sorunların çoğunu çözmek, ve (en azından sürece biz php hakkında konuşmak gibi) gerçekten şık kod mümkün kılar.
bağlı değişkenler açıkça tanımlanmış değildir, çünkü javascript programcılar, hatta bazen bilmeden, Closures her zaman kullanabilirsiniz - bu "kullanmak" ne php içindir.
Yukarıda biri daha gerçek dünya örnekleri vardır. Bir alt-değer tarafından bir boyutlu bir dizi, ama önemli değişiklikleri sıralamak söylüyorlar sağlar.
<?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ş kodu (i PHP5.3 yüklü atm yok), ama böyle bir şey gibi görünmelidir.
Tek dezavantajı var: Eğer kapanışları ile yüzleşmek durumunda php geliştiricileri bir sürü biraz çaresiz olabilir.
Daha kapaklar güzel-ty anlamak için, sana başka bir örnek vereyim - javascript bu kez. sorunlardan biri kapsam belirleme ve tarayıcı doğasında asynchronity olduğunu. Özellikle, bu window.setTimeout();
(ya da-aralık) gelirse. parametrelerini sağlayan kodu çalıştırır, çünkü böylece, sen setTimeout bir fonksiyonu geçmek, ama sen gerçekten herhangi bir parametre veremem!
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 ile bir işlevi döndüren!
Dürüst olmak gerekirse, ben php 5.3 ve anonim fonksiyonlar / kapanışları beri çok daha fazla seviyorum. ad alanları daha önemli olabilir, but they're a lot less sexy.