Анонимные функции доступны из PHP 5.3.
Должен ли я использовать их или избегать? Если да, то как?
Отредактировано ; просто нашел приятный трюк с анонимными функциями php …
$container = new DependencyInjectionContainer(); $container->mail = function($container) {}; $conteiner->db = function($container) {}; $container->memcache = function($container) {};
Анонимные функции полезны при использовании функций, для которых требуется функция обратного вызова, например 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, так что это всего лишь предположение.