Подтвердить что ты не робот

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

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

Edited; просто нашел приятный трюк с анонимными функциями php...

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

Ответ 1

Анонимные функции полезны при использовании функций, для которых требуется функция обратного вызова like 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);

Ответ 2

Анонимные функции доступны из 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
)

Ответ 3

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

Ответ 4

Анонимные функции могут быть очень полезны при создании функции в контейнере 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, но экземпляры будут созданы, только если вам это нужно.

Ответ 5

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