Возможный дубликат:
Как вы используете анонимные функции в PHP?
Почему я должен использовать анонимную функцию? Я имею в виду, что это за реальная сделка? Я просто не понимаю. Я имею в виду, вы используете функцию, чтобы сделать код более чистым или использовать его более одного раза. Но анонимные функции просто не выполняют ни первого, ни второго. Я искал их, и я не мог найти никого, кто задал бы ту же проблему.
Я бы сказал, что анонимные функции показывают свою красоту, когда есть хорошие классы / функции библиотеки, которые их используют. Они не такие сексуальные сами по себе. В мире .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; } )
Он вычисляет произведение четных чисел.
Некоторая философия. Что такое функция? Единица функциональности, которую можно вызвать, и повторное использование единицы повторного использования кода. Иногда вам нужна только первая часть: способность вызывать и выполнять действия, но вы не хотите повторно использовать ее вообще и даже сделать ее видимой для других частей кода. Вот что делает анонимные функции.
Это особенно полезно для обратных вызовов:
array_walk($myArray, function($value, $key) { // do something });
Обычно вы используете анонимные функции для функций, которые вам нужны только один раз. Таким образом, вы не загрязняете пространство имен функций и не изобретаете странные имена функций, такие как array_walk_callback1
.
Возможно, наиболее очевидной причиной является использование обратных вызовов. Возьмем usort()
например. Нет смысла вводить однострочную функцию, которая будет использоваться только один раз. Анонимная функция (обычно) лучше подходит для этой задачи.
Вы можете передавать анонимные функции, сохраняя их в переменной.
$a=function() { echo 'hello world'; };
Это означает, что вы также можете использовать их более одного раза.
Если вам нужно создать обратный вызов (чтобы сделать конкретный пример, скажем, его функцию сравнения для usort), анонимные функции обычно являются хорошим способом. В частности, если определение функции зависит от нескольких входов (этим я подразумеваю замыкание, которое НЕ является синонимом функции anon)
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
Есть моменты, когда вы ДОЛЖНЫ использовать функцию. Таким образом, замыкания сохраняют код чистым, не заполняя ваши библиотеки декларациями функций, которые используются только в одном месте. Закрытие похоже на style=""
и классы в CSS. Конечно, вы можете создать лодку классов для каждого отдельного стиля, который у вас есть, или вы можете внедрить их на место, так как вы не используете его в другом месте и не уменьшаете раздувание ваших CSS-файлов.
Однако это не является необходимостью, поэтому, если вы чувствуете необходимость явно объявлять функции, вы можете это сделать.
На мой взгляд, анонимные функции лучше всего использовать в качестве обратных вызовов для функций. Многие из функций массива php будут использовать эти параметры.
Они также могут использоваться в шаблонах слушателя / события .
Используя jQuery / Javascript, вы можете использовать его для определения пользовательских обратных вызовов событий. Посмотрите, как ядро jQuery обрабатывает AJAX .
$.ajax({ url: 'ajax/test.html', complete: function(data) { $('.result').html(data); alert('Load was performed.'); } });
Другие события с пользовательскими обратными beforeSend
, error
, success
. Вы можете в полной мере воспользоваться этой гибкой системой обратного вызова событий при создании пользовательских плагинов