Какая польза от лямбда в PHP?



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



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

621   5  

5 ответов:

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

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

например.

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 " переменные, которые передаются или создаются функцией enclosing, могут использоваться внутри закрытия. Это очень полезно в функциях обратного вызова, которые ограничены в их списке параметров. Переменные" 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);

(конечно, этот пример может быть проще без закрытия, но это только для демонстрации.)

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

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

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

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

также очень полезны выбрасывать или функции обратного вызова, которые @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

Comments

    Ничего не найдено.