закриття прекрасні! вони вирішують безліч проблем, пов’язаних з анонімними функціями, і роблять дійсно елегантний код можливим (принаймні, поки ми говоримо про php).
Програмісти javascript постійно використовують закриття, іноді навіть не знаючи про це, оскільки пов'язані змінні не визначені явно - саме для цього використовується "php".
є кращі приклади реального світу, ніж наведені вище. скажемо, вам доведеться сортувати багатовимірний масив за під-значенням, але ключ змінюється.
<?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);
?>
попередження: неперевірений код (у мене не встановлено php5.3 atm), але він повинен виглядати приблизно так.
є один недолік: багато розробників PHP можуть бути трохи безпорадними, якщо протистояти їм закриттям.
щоб більше зрозуміти приємність закриття, я наведу ще один приклад - на цей раз у JavaScript. Однією з проблем є визначення асинхронності і властивості браузера. особливо, якщо мова йде про window.setTimeout();
(або -інтервал). Таким чином, ви передаєте функцію setTimeout, але реально не можете надати жодних параметрів, оскільки надання параметрів виконує код!
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 повертає функцію з наперед визначеним параметром!
якщо чесно, мені подобається php набагато більше, ніж 5.3 та анонімні функції / закриття. простори імен можуть бути важливішими, але вони набагато менш сексуальні .