Короткие замыкания, также известные как функции со стрелками, – это короткие функции, написанные на 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
- Может содержать только одно выражение, то есть возвращаемое выражение
- Ключевое слово Return можно игнорировать
- Параметры и типы возвращаемых данных могут использоваться для указания типа
В приведенном выше примере более строгое ограничение типа может быть записано следующим образом:
$идентификаторы(fn(сообщение $сообщение): int => $сообщение->идентификатор, $сообщения);
Необходимо отметить два момента:
- Также допускаются операторы расширения
- Ссылка разрешена. Оба параметра можно использовать в качестве возвращаемых значений
Если вы хотите возвращать результаты по ссылке, вам следует использовать следующий синтаксис:
fn&($x) => $x
Короче говоря, короткие замыкания выполняют ту же функцию, что и обычные замыкания, за исключением того, что допускается только одно выражение.
Один ряд
Вы должны понять это правильно: короткое замыкание может иметь только одно выражение. Это означает, что в закрытии не может быть более одной строки.
Причина заключается в следующем: цель коротких замыканий-уменьшить избыточность. В любом случае, конечно, FN короче, чем функция. Однако Никита Попов, создатель RFC, считает, что если вы имеете дело с функциями с многострочными выражениями, преимущества использования замыканий еще меньше.
В конце концов, определение многострочных замыканий избыточно, поэтому оно не будет сильно отличаться, если есть два ключевых слова (функция и возврат).
Согласны вы или нет, зависит от вас. Хотя я могу вспомнить о многих закрытиях одной полосы движения в моем проекте, есть также много закрытий нескольких линий. С личной точки зрения, мне понравится краткий синтаксис в этих ситуациях.
Однако есть надежда: в будущем могут быть добавлены короткие замыкания с несколькими строками, но это также отдельный RFC.
Значение внешней области
Еще одной важной особенностью коротких замыканий и обычных замыканий является то, что им не нужно использовать ключевое слово use для доступа к данным из внешних областей.
$modifier = 5; array_map(fn($x) => $x * $modifier, $numbers);
Обратите внимание, что вы не можете изменять переменные во внешней области. Потому что это относится к передаче значений, а не к передаче ссылок. Это означает, что вы можете изменить переменную $модификатор
, но это не влияет на переменные $модификатор
.
Конечно, есть исключение-ключевое слово $this, которое выполняет точно такую же функцию, как и обычное закрытие:
array_map(fn($x) => $x * $this->модификатор, $числа);
Перспективы развития
Еще одна идея, которая мне приходит в голову, – разрешить короткие замыкания в классах, таких как геттеры и сеттеры
class Post { private $title; fn getTitle() => $this->title; }
В целом, короткие закрытия являются популярной функцией, хотя есть много областей, которые необходимо улучшить. Наиболее вероятным из них является многострочное закрытие
резюме
Выше приведен пример функции стрелки нового синтаксиса PHP 7.4, представленного вам Xiaobian. Я надеюсь, что это вам поможет. Если у вас есть какие-либо вопросы, пожалуйста, оставьте мне сообщение, и Сяобянь ответит вам вовремя. Большое вам спасибо за поддержку разработанного бумажного сайта! Если вы считаете, что эта статья полезна для вас, добро пожаловать на перепечатку, пожалуйста, укажите источник, спасибо!