Какое использование лямбда в 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?