Анонимная функция лямбда является частью PHP 5.3. Какое использование имеет? Есть ли что-нибудь, что можно делать только с лямбдой? Является ли лямбда лучше для определенных задач?
Я видел пример Фибоначчи, и мне действительно не нужно писать последовательности Фибоначчи, поэтому я все еще не уверен, что это полезно для тех задач, с которыми я сталкиваюсь при написании приложений веб-приложений. Так что же с ним делать в «реальной жизни»?
Все, что требует временной функции, которое вы, вероятно, будете использовать только один раз.
Я бы использовал их для обратных вызовов для таких функций, как:
Например
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;'));
Анонимные функции (замыкания) могут быть созданы как локальные функции (таким образом, не перекрывая глобальное пространство, как предложил Датан).
С ключевым словом «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);
(Конечно, этот пример может быть проще без закрытия, но это просто для демонстрации.)
Есть несколько вариантов использования, которые более удобны для lambdas. Например, если метод использует обратный вызов, использование лямбда для этого обратного вызова означает, что вам не нужно определять «реальную» функцию где-нибудь, чтобы ее обрабатывать. Итак, лямбды сохраняют ваш код чище.
Как и в случае с вышеизложенным, лямбды могут использоваться как «недолговечные» функции. Например, алгоритмы сортировки обычно должны знать только если переменная a
меньше переменной b
для любой комбинации a
и b
. Чтобы создать общий алгоритм сортировки, способный обрабатывать любой класс объектов, вы можете сделать определение функции сортировки таким, чтобы оно принимало функцию, используемую в качестве компаратора. Предоставление лямбды в качестве функции компаратора означает, что вы можете определить свое поведение сортировки для каждого вызова, вместо того, чтобы определять «реальную» функцию, которая будет жить в течение всего срока действия вашего сценария, чтобы справиться с этим одним случаем сортировки.
Несмотря на все виды использования, которые можно использовать для лямбда-функций, в PHP он также допускает нечто особенное, называемое замыканием. Это возможность сделать переменные в текущей области доступными для функции задолго до того, как текущая область перестанет существовать.
Чтобы упомянуть некоторые полезные шаблоны, которые позволяют вам закрыть, можно реализовать Memoization (Caching) и Curry .
Также очень полезны функции отбрасывания или обратного вызова, которые @Matt выделил в своем ответе.
Для получения дополнительной информации о закрытии, проверьте этот вопрос: как работают блокировки JavaScript?
Реализация загадочного Y-комбинатора?
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