Какая польза от лямбды в PHP? - PullRequest
55 голосов
/ 15 декабря 2009

Лямбда-анонимная функция является частью PHP 5.3. Какая польза от этого? Есть ли что-нибудь, что можно сделать только с лямбдой? Лямбда лучше для определенных задач?

Я видел пример Фибоначчи, и мне действительно не нужно писать последовательности Фибоначчи, поэтому я все еще не уверен, насколько это полезно для задач, с которыми я сталкиваюсь при написании веб-приложений. Так что же делать с этим в «реальной жизни»?

Ответы [ 5 ]

79 голосов
/ 15 декабря 2009

Все, что требует временной функции, которую вы, вероятно, будете использовать только один раз.

Я бы использовал их для обратных вызовов, для таких функций, как:

Е.Г.

usort($myArray, function ($a, $b) {
    return $a < $b;
});

До версии 5.3 вам придется ..

function mySort ($a, $b) {
    return $a < $b;
}
usort($myArray, 'mySort');

Или создать_функцию ...

usort($myArray, create_function('$a, $b', 'return $a < $b;'));
11 голосов
/ 15 декабря 2009

Анонимные функции (замыкания) могут создаваться как локальные функции (таким образом, не загрязняя глобальное пространство, как предположил Датан).

С ключевым словом "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 голосов
/ 25 ноября 2013

Несмотря на все возможные варианты использования лямбда-функций, в PHP это также допускает нечто особенное, называемое замыканием. Это возможность сделать переменные в текущей области доступными для функции еще долго после того, как текущая область перестает существовать.

Просто чтобы упомянуть некоторые полезные шаблоны, которые позволяют закрытие, можно реализовать Memoization (Caching) и Curry .

Также очень полезны одноразовые или функции обратного вызова, которые @Matt выделил в своем ответе.

Чтобы узнать больше о замыканиях, проверьте этот вопрос: Как работают замыкания JavaScript?

3 голосов
/ 15 декабря 2009

Есть некоторые варианты использования, которые сделаны более удобными лямбдами. Например, если метод использует обратный вызов, использование лямбды для этого обратного вызова означает, что вам не нужно определять «настоящую» функцию где-то для ее обработки. Итак, лямбды сохраняют ваш код чище.

Как и выше, лямбды можно использовать как «недолговечные» функции. Например, алгоритмам сортировки обычно нужно только знать, меньше ли переменная a, чем переменная b для любой комбинации a и b. Чтобы создать общий алгоритм сортировки, способный обрабатывать любой класс объектов, вы можете задать определение функции сортировки таким образом, чтобы она принимала функцию для использования в качестве компаратора. Предоставление лямбда-функции в качестве функции сравнения означает, что вы можете определять свое поведение сортировки для каждого вызова вместо того, чтобы определять «реальную» функцию, которая будет действовать в течение всего времени жизни вашего сценария только для обработки этого случая сортировки. 1007 *

1 голос
/ 15 декабря 2009

Реализация загадочного 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...