Какое использование является лямбдой в PHP?

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

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

56
задан user151841 11 February 2018 в 19:35
поделиться

4 ответа

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

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

Например,

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;'));
81
ответ дан 26 November 2019 в 17:23
поделиться

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

С ключевым словом 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);

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

11
ответ дан 26 November 2019 в 17:23
поделиться

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

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

3
ответ дан 26 November 2019 в 17:23
поделиться

Реализация зашифрованного комбинатора 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

1
ответ дан 26 November 2019 в 17:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: