Анонимные функции доступны от PHP 5.3.
Я должен использовать их или избежать их? Если так, как?
Отредактированный; просто найденный некоторым хорошим приемом с php анонимными функциями...
$container = new DependencyInjectionContainer();
$container->mail = function($container) {};
$conteiner->db = function($container) {};
$container->memcache = function($container) {};
Анонимные функции полезны при использовании функций, требующих функции обратного вызова, например array_filter
или array_map
do:
$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 о анонимных функциях . На самом деле это неплохо.
Типичное использование анонимных функций - это функции обратного вызова. Например, вы можете использовать их для обратного вызова из алгоритмов сортировки, таких как функция uksort
( http://lv.php.net/uksort ) или замены таких алгоритмов, как preg_replace_callback
( http://lv.php.net/manual/en/function.preg-replace-callback.php ).
Я сам не пробовал использовать PHP, поэтому это всего лишь предположение.
Анонимные функции доступны в 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
)