Penutupan itu indah! mereka memecahkan banyak masalah yang datang dengan fungsi anonim, dan membuat kode yang sangat elegan mungkin (setidaknya selama kita berbicara tentang php).
programmer javascript menggunakan closure sepanjang waktu, kadang-kadang bahkan tanpa menyadarinya, karena variabel terikat tidak didefinisikan secara eksplisit - itulah gunanya "digunakan" untuk di php.
ada contoh dunia nyata yang lebih baik daripada yang di atas. katakanlah Anda harus mengurutkan array multidimensi berdasarkan sub-nilai, tetapi kuncinya berubah.
<?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);
?>
peringatan: kode yang belum diuji (saya tidak memasang atm php5.3), tetapi seharusnya terlihat seperti itu.
ada satu kelemahan: banyak pengembang php mungkin sedikit tidak berdaya jika Anda menghadapi mereka dengan penutupan.
untuk memahami lebih banyak tentang penutupan, saya akan memberikan Anda contoh lain - kali ini dalam javascript. salah satu masalah adalah pelingkupan dan asinkronitas browser yang melekat. khususnya, jika menyangkut window.setTimeout();
(atau -interval). jadi, Anda meneruskan fungsi ke setTimeout, tetapi Anda tidak dapat benar-benar memberikan parameter apa pun, karena memberikan parameter mengeksekusi kode!
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 mengembalikan fungsi dengan parameter yang sudah ditentukan sebelumnya!
jujur, saya lebih suka php lebih dari 5.3 dan fungsi / penutupan anonim. ruang nama mungkin lebih penting, tetapi mereka jauh kurang seksi .