Какое использование лямбда в PHP?
Анонимная функция лямбда является частью PHP 5.3. Какое использование имеет? Есть ли что-нибудь, что можно делать только с лямбдой? Является ли лямбда лучше для определенных задач?
Я видел пример Фибоначчи, и мне действительно не нужно писать последовательности Фибоначчи, поэтому я все еще не уверен, насколько он полезен для тех задач, с которыми я сталкиваюсь при написании приложений веб-приложений. Так что же с ним делать в "реальной жизни"?
Ответы
Ответ 1
Все, что требует временной функции, которую вы, вероятно, будете использовать только один раз.
Я бы использовал их для обратных вызовов для таких функций, как:
например.
usort($myArray, function ($a, $b) {
return $a < $b;
});
До 5.3 вам придется...
function mySort ($a, $b) {
return $a < $b;
}
usort($myArray, 'mySort');
Или create_function...
usort($myArray, create_function('$a, $b', 'return $a < $b;'));
Ответ 2
Анонимные функции (замыкания) могут быть созданы как локальные функции (таким образом, не перекрывая глобальное пространство, как предложил Датан).
С ключевым словом "use" в закрытии могут использоваться переменные, которые передаются или создаются закрывающей функцией. Это очень полезно для функций обратного вызова, которые ограничены в списке параметров. Переменные "use" могут быть определены вне закрытия, что исключает необходимость переопределять их каждый раз, когда вызывается замыкание.
function change_array($arr, $pdo)
{
$keys = array('a', 'c');
$anon_func = function(& $val, $key) use ($keys, $pdo)
{
if (in_array($key, $keys) {
$pdo->query('some query using $key');
$val = $pdo->fetch();
}
}
arr_walk($arr, $anon_func);
return $arr;
}
$pdo = new($dsn, $uname, $pword);
$sample = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4);
$sample = change_array($sample, $pdo);
(Конечно, этот пример может быть проще без закрытия, но это просто для демонстрации.)
Ответ 3
Есть несколько вариантов использования, которые более удобны для lambdas. Например, если метод использует обратный вызов, использование лямбда для этого обратного вызова означает, что вам не нужно определять "реальную" функцию где-нибудь, чтобы ее обрабатывать. Итак, lambdas очистит ваш код.
Как и в случае вышеизложенного, лямбды могут использоваться как "недолговечные" функции. Например, алгоритмы сортировки обычно должны знать только, если переменная a
меньше переменной b
для любой комбинации a
и b
. Чтобы создать общий алгоритм сортировки, способный обрабатывать любой класс объектов, вы можете сделать свое определение функции сортировки таким, чтобы оно принимало функцию, используемую в качестве компаратора. Предоставление лямбды в качестве функции компаратора означает, что вы можете определить свое поведение сортировки на основе каждого вызова, вместо того, чтобы определять "реальную" функцию, которая будет жить в течение всего срока службы вашего script только для обработки этого одного случая сортировки.
Ответ 4
Несмотря на все виды использования, которые можно использовать для лямбда-функций, в PHP он также допускает нечто особенное, называемое замыканием. Это возможность сделать переменные в текущей области доступными для функции задолго до того, как текущая область перестанет существовать.
Чтобы упомянуть некоторые полезные шаблоны, которые позволяют вам закрыть, можно реализовать Memoization (Caching) и Curry.
Также очень полезны функции отбрасывания или обратного вызова, которые @Matt выделил в своем ответе.
Подробнее о закрытии, проверьте этот вопрос: Как работают блокировки JavaScript?
Ответ 5
Реализация загадочного Y combinator?
function Y($F)
{
$func = function ($f) { return $f($f); };
return $func(function ($f) use($F)
{
return $F(function ($x) use($f)
{
$ff = $f($f);
return $ff($x);
});
});
}
Источник цитирования: http://fabien.potencier.org/article/17/on-php-5-3-lambda-functions-and-closures