Đóng cửa thật đẹp! họ giải quyết rất nhiều vấn đề đi kèm với các hàm ẩn danh và tạo ra mã thực sự thanh lịch (ít nhất là miễn là chúng ta nói về php).
Các lập trình viên javascript sử dụng các bao đóng mọi lúc, đôi khi thậm chí không biết điều đó, bởi vì các biến bị ràng buộc không được xác định rõ ràng - đó là những gì "sử dụng" dành cho php.
có những ví dụ thực tế tốt hơn so với ví dụ trên. giả sử bạn phải sắp xếp một mảng nhiều chiều theo một giá trị phụ, nhưng khóa thay đổi.
<?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);
?>
cảnh báo: mã chưa được kiểm tra (tôi không cài đặt atm php5.3), nhưng nó sẽ trông giống như thế.
Có một nhược điểm: rất nhiều nhà phát triển php có thể hơi bất lực nếu bạn đối đầu với họ bằng việc đóng cửa.
để hiểu rõ hơn về cách đóng cửa nhiều hơn, tôi sẽ cho bạn một ví dụ khác - lần này là trong javascript. một trong những vấn đề là phạm vi và sự không đồng bộ vốn có của trình duyệt. đặc biệt, nếu nói đến window.setTimeout();
(hoặc -interval). vì vậy, bạn chuyển một hàm cho setTimeout, nhưng bạn thực sự không thể đưa ra bất kỳ tham số nào, bởi vì việc cung cấp các tham số thực thi mã!
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 trả về một hàm với một loại tham số được xác định trước!
Thành thật mà nói, tôi thích php hơn rất nhiều kể từ 5.3 và các hàm / đóng ẩn danh. không gian tên có thể quan trọng hơn, nhưng chúng ít gợi cảm hơn .