крышки прекрасны! они решают множество проблем, связанных с анонимными функциями, и делают возможным действительно элегантный код (по крайней мере, пока мы говорим о 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();
(или -interval). Итак, вы передаете функцию в 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 и анонимные функции / замыкания. пространства имен могут быть более важными, , но они намного менее сексуальны .
нашел это ....
Как принудительно использовать nolock hint для входа на сервер sql
кажется лучшим способом для этого нужно выдать
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
любая другая идея ???
ps
другой связанный вопрос ...
Как совершенно справедливо говорят другие, глобальное (nolock) выполняется с использованием READ UNCOMMITTED.
Однако, прежде чем идти по этому пути, стоит сначала попробовать READ COMMITTED SNAPSHOT. Это означает, что ваши чтения не будут заблокированы выполняющимися вставками / обновлениями, а также означает, что данные не грязные, а просто устаревшие.
Я думаю, это то, что вы ищете ...
УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ ТРАНЗАКЦИИ ЧИТАТЬ НЕОБХОДИМО
Вы хотите использовать следующий синтаксис :
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Я нашел это, посмотрев на подсказка таблицы NOLOCK расположена здесь . Подсказка таблицы WITH (NOLOCK) эквивалентна установке уровня изоляции READ UNCOMMITTED. Вот фрагмент из MSDN : Эквивалентно READUNCOMMITTED. Для получения дополнительной информации см. READUNCOMMITTED далее в этом разделе.
Однако вы можете получить неверные данные. В 2005 году предпочтительнее использовать изоляцию моментальных снимков: «Когда изоляция снимков помогает и когда больно» http://www.devx.com/dbzone/Article/32957