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

Зачем использовать анонимную функцию?

Возможный дубликат:
Как вы используете анонимные функции в PHP?

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

4b9b3361

Ответ 1

Я бы сказал, что анонимные функции показывают свою красоту, когда есть хорошие классы/функции библиотеки, которые их используют. Они не такие сексуальные сами по себе. В мире .net есть технология под названием LINQ, которая в огромной степени использует ее очень идиоматично. Теперь вернемся к PHP.

Первый пример, sort:

uasort($array, function($a, $b) { return($a > $b); });

Вы можете указать сложную логику для сортировки:

uasort($array, function($a, $b) { return($a->Age > $b->Age); });

Другой пример:

$data = array( 
        array('id' => 1, 'name' => 'Bob', 'position' => 'Clerk'), 
        array('id' => 2, 'name' => 'Alan', 'position' => 'Manager'), 
        array('id' => 3, 'name' => 'James', 'position' => 'Director') 
); 

$names = array_map( 
        function($person) { return $person['name']; }, 
        $data 
);

Вы видите, как приятно вы можете создать массив имен.

Последний:

array_reduce(
   array_filter($array, function($val) { return $val % 2 == 0; },
   function($reduced, $value) { return $reduced*$value; }
)

Он вычисляет произведение четных чисел.

Некоторая философия. Что такое функция? Единица функциональности, которую можно вызвать, и повторное использование единицы повторного использования кода. Иногда вам нужна только первая часть: способность вызывать и выполнять действия, но вы не хотите повторно использовать ее вообще и даже сделать ее видимой для других частей кода. То, что по сути делают анонимные функции.

Ответ 2

Это полезно особенно для обратных вызовов:

array_walk($myArray, function($value, $key) {
   // do something
});

Ответ 3

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

Ответ 4

Возможно, наиболее очевидной причиной является использование обратных вызовов. Возьмем, например, функцию usort(). Нет смысла вводить однострочную функцию, которая будет использоваться только один раз. Анонимная функция (обычно) подходит для этой задачи.

Ответ 5

Вы можете передавать анонимные функции, сохраняя их в переменной.

$a=function() {
    echo 'hello world';
};

Это означает, что вы также можете использовать их более одного раза.

Ответ 6

Есть моменты, когда вы ДОЛЖНЫ использовать функцию. Таким образом, замыкания сохраняют код чистым, не заполняя ваши библиотеки декларациями функций, которые используются только в одном месте. Закрытие похоже на style="" и классы в CSS. Конечно, вы можете создать лодку классов для каждого отдельного стиля, который у вас есть, или вы можете внедрить их на место, так как вы не используете его в другом месте и не уменьшаете раздувание ваших файлов CSS.

Это не обязательно, поэтому, если вы чувствуете необходимость явно объявлять функции, вы можете это сделать.

Ответ 7

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

function createCallback($key, $desc = false)
{
    return $desc ? 
       function($a, $b) use ($key) {return $b[$key] - $a[$key];} :
       function($a, $b) use ($key) {return $a[$key] - $b[$key];};
}


usort($myNestedArray, createCallback('age'));  //sort elements of $myNestedArray by key 'age' ascending
usort($myNestedArray, createCallback('age', true); //descending

Ответ 9

Используя jQuery/Javascript, вы можете использовать его для определения пользовательских обратных вызовов событий. Посмотрите, как ядро ​​jQuery обрабатывает AJAX.

Пример jQuery с использованием анонимных функций для обратных вызовов событий:

$.ajax({
  url: 'ajax/test.html',
  complete: function(data) {
    $('.result').html(data);
    alert('Load was performed.');
  }
});

Другие события с пользовательскими обратными вызовами beforeSend, error, success. Вы можете в полной мере воспользоваться этой гибкой системой обратного вызова событий, когда создание пользовательских плагинов