Короткие замыкания, также известные как функции со стрелками, – это короткие функции, написанные на php . Эта функция очень полезна при передаче замыканий функциям, таким как использование array_map Или array_filter Время выполнения функции.
Вот как они выглядят:
// Collection of Post Objects $posts = [/* … */]; $ids = array_map(fn($post) => $post->id, $posts);
В прошлом вам приходилось писать вот так:
$ids = array_map(function ($post) {
return $post->id;
}, $posts);
Давайте подытожим, как используются функции короткого замыкания.
- Доступно в PHP 7.4
- с
fnНачало ключевого слова - Может содержать только Одно Выражение, то есть возвращаемые выражения
возвратКлючевое слово незначительно- Подсказки типа могут быть сделаны как для параметров, так и для типов возвращаемых данных
Более строгое ограничение типа приведенных выше примеров может быть записано:
$ids = array_map(fn(Post $post): int => $post->id, $posts);
Необходимо отметить два момента:
- Также допускаются операторы расширения
- Ссылки разрешены, и оба параметра могут использоваться в качестве возвращаемых значений
Если вы хотите вернуть результат по ссылке, вам следует использовать следующую грамматику:
fn&($x) => $x
Короче говоря, короткие замыкания выполняют ту же функцию, что и обычные замыкания, за исключением того, что допускается только одно выражение.
Один ряд
Вы должны понять это правильно: короткие замыкания могут иметь только Одно Выражение. Это означает, что в теле закрытия больше не может быть строк.
Причины заключаются в следующем: Цель коротких замыканий-уменьшить избыточность. Конечно, в любом случае fn Все соотношение функция Короткое. Однако Никита Попов, основатель RFC, утверждает, что если вы имеете дело с функциями многострочных выражений, замыкания менее выгодны.
В конце концов, определение многострочных замыканий избыточно, поэтому ключевых слов нет и нет.( функция и возврат ) Это не будет иметь большого значения.
Согласны вы или нет, зависит от вас. Хотя в моем проекте я могу придумать множество сценариев закрытия одной полосы движения, существует также много случаев закрытия нескольких линий. Лично мне в этих случаях понравятся короткие фразы.
Надеюсь, однако, что в будущем можно будет добавить несколько коротких замыканий, но это также будет отдельный RFC.
Значение внешней области
Еще одной характерной особенностью коротких замыканий и обычных замыканий является то, что короткие замыкания не нужно использовать использовать Доступ по ключевым словам к данным из внешних областей.
$modifier = 5; array_map(fn($x) => $x * $modifier, $numbers);
Важно отметить, что переменные во внешней области не могут быть изменены. Потому что это относится к передаче значений, а не к передаче ссылок. Это означает, что вы Уверены Измените переменную короткого замыкания $модификатор , но она не будет находиться во внешней области $модификатор Переменные оказывают влияние.
Конечно, есть исключение, то есть $это Ключевое слово, функция которого точно такая же, как у обычных замыканий:
array_map(fn($x) => $x * $this->modifier, $numbers);
Перспективы развития
Многострочные замыкания, о которых я упоминал, все еще являются возможностью для дальнейшего развития. Еще одна идея, которая мне приходит в голову, – разрешить использование коротких замыканий в классах, таких как геттеры и сеттеры Функции.
class Post {
private $title;
fn getTitle() => $this->title;
}
Короче говоря, короткие закрытия-очень популярная функция, хотя есть много областей, которые необходимо улучшить. Скорее всего, многострочные замыкания.
От: https://learnku.com/php/t/28219
Дополнительные статьи: https://learnku.com/php/c/tra…