Зачем использовать анонимную функцию?
Возможный дубликат:
Как вы используете анонимные функции в PHP?
Почему я должен использовать анонимную функцию? Я имею в виду, что это реальная сделка?
Я просто не понимаю. Я имею в виду, вы используете функцию, чтобы сделать код более чистым или использовать его более одного раза. Но анонимные функции просто не выполняют ни первого, ни второго.
Я искал их, и я не мог найти никого, кто задал бы ту же проблему.
Ответы
Ответ 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
Ответ 8
На мой взгляд, анонимные функции лучше всего использовать в качестве обратных вызовов для функций. Многие из функций массива php будут использовать их как параметры.
Они также могут использоваться в шаблонах наблюдателя/события-слушателя.
Ответ 9
Используя jQuery/Javascript, вы можете использовать его для определения пользовательских обратных вызовов событий. Посмотрите, как ядро jQuery обрабатывает AJAX.
Пример jQuery с использованием анонимных функций для обратных вызовов событий:
$.ajax({
url: 'ajax/test.html',
complete: function(data) {
$('.result').html(data);
alert('Load was performed.');
}
});
Другие события с пользовательскими обратными вызовами beforeSend
, error
, success
. Вы можете в полной мере воспользоваться этой гибкой системой обратного вызова событий, когда создание пользовательских плагинов