Почему и как вы используете анонимные функции в PHP?

Анонимные функции доступны из PHP 5.3.
Должен ли я использовать их или избегать? Если да, то как?

Отредактировано ; просто нашел приятный трюк с анонимными функциями php …

$container = new DependencyInjectionContainer(); $container->mail = function($container) {}; $conteiner->db = function($container) {}; $container->memcache = function($container) {}; 

Solutions Collecting From Web of "Почему и как вы используете анонимные функции в PHP?"

Анонимные функции полезны при использовании функций, для которых требуется функция обратного вызова, например array_filter или array_map :

 $arr = range(0, 10); $arr_even = array_filter($arr, function($val) { return $val % 2 == 0; }); $arr_square = array_map(function($val) { return $val * $val; }, $arr); 

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

 function isEven($val) { return $val % 2 == 0; } $arr_even = array_filter($arr, 'isEven'); function square($val) { return $val * $val; } $arr_square = array_map('square', $arr); 

Анонимные функции доступны из PHP 5.3.

Анонимные функции были доступны в PHP в течение длительного времени: create_function существует с PHP 4.0.1. Однако вы совершенно правы, что есть новая концепция и синтаксис, доступные с PHP 5.3.

Должен ли я использовать их или избегать? Если да, то как?

Если вы когда-либо использовали create_function раньше, то новый синтаксис может просто проскользнуть прямо там, где вы его использовали. Как упоминалось в других ответах, общий случай заключается в том, что функции «отбрасывания» должны использоваться только один раз (или, по крайней мере, в одном месте). Обычно это происходит в виде обратных вызовов для подобных array_map / reduce / filter , preg_replace_callback , usort и т. Д.

Пример использования анонимных функций для подсчета количества раз, когда буквы появляются в словах (это может быть сделано несколькими другими способами, это просто пример):

 $array = array('apple', 'banana', 'cherry', 'damson'); // For each item in the array, count the letters in the word $array = array_map(function($value){ $letters = str_split($value); $counts = array_count_values($letters); return $counts; }, $array); // Sum the counts for each letter $array = array_reduce($array, function($reduced, $value) { foreach ($value as $letter => $count) { if ( ! isset($reduced[$letter])) { $reduced[$letter] = 0; } $reduced[$letter] += $count; } return $reduced; }); // Sort counts in descending order, no anonymous function here :-) arsort($array); print_r($array); 

Что дает (сокращенно для краткости):

 Array ( [a] => 5 [n] => 3 [e] => 2 ... more ... [y] => 1 ) 

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

Анонимные функции могут быть очень полезны при создании функции в контейнере DI, например, «bootstrap.php»:

 //add sessions $di->add("session",function(){ return new Session(); }); //add cache $di->add("cache",function(){ return new Cache(); }); //add class which will be used in any request $di->add("anyTimeCalledClass", new SomeClass()); 

Пример с параметрами использования и следующими переменными

 $di->add("myName",function($params) use($application){ $application->myMethod($params); }); 

Здесь вы можете увидеть, как использовать анонимные функции для сохранения памяти и загрузки сервера. Вы можете определить все важные плагины, классы в контейнере di , но экземпляры будут созданы, только если вам это нужно.

Типичное использование анонимных функций – это функции обратного вызова. Например, вы можете использовать их для обратного вызова из алгоритмов сортировки, таких как функция uksort ( http://lv.php.net/uksort ) или замены алгоритмов, таких как preg_replace_callback ( http://lv.php.net/manual/en /function.preg-replace-callback.php ). Не пробовал сам в PHP, так что это всего лишь предположение.