Intereting Posts
Propel.xml дает мне ошибку – Недопустимый тип для пути "propel.database.connections.cfs.attributes". Ожидаемый массив, но получил строку Передача файлов PHP PHP для подключения к Hotmail для отправки электронной почты? Получить IP-адрес из ifconfig с помощью PHP Не удается получить доступ к экземпляру amazon ec2 Браузер не будет устанавливать cookie из события onclick file_get_contents (- Исправить относительные URL-адреса MySQL – Как выбрать строки, в которых значение находится в массиве? Могу ли я добавить промежуточное ПО к файлу Guzzle 6 HandlerStack по умолчанию, а не создавать новый стек? Зачем мне перематывать IteratorIterator jquery не скрывает невыбранные вкладки на php-странице, размещенной на сервере xampp Laravel 5.3 цепной пагинат после фильтра Laravel: Auth :: user () -> id пытается получить свойство не-объекта Как получить доступ к элементам счета-фактуры Quickbooks, используя php api openSSL не работает с встроенным веб-сервером PHP

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

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

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

Solutions Collecting From Web of "Какое использование лямбда в PHP?"

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

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

  • usort
  • preg_replace_callback

Например

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