PHP 3857 ~ 2 мин.

Короткие замыкания в PHP

Короткие замыкания в PHP

Короткие замыкания, также называемые стрелочными функциями, являются способом написания более коротких анонимных функций в PHP. Эта полезн

Вот как они выглядят:


// коллекция Post объектов
$posts = [/* … */];

$ids = array_map(fn($post) => $post->id, $posts);

Раньше писали так:


$ids = array_map(function ($post) {
    return $post->id;
}, $posts);

Итак, что можно сказать про короткие замыкания.

  • Они начинаются с ключевого слова fn
  • Они доступны с PHP 7.4
  • Они могут иметь только одно выражение, которое является оператором return
  • Ключевое слово return можно опустить
  • Аргументы и возвращаемые типы могут быть подсказаны

Более строго типизированный способ написания приведенного выше примера может быть таким:


$ids = array_map(fn(Post $post): int => $post->id, $posts);

Стоит упомянуть еще пару вещей:

  • Оператор спреда (...) разрешен
  • Разрешены ссылки как на аргументы, так и на возвращаемые значения.

Если вы хотите вернуть значение по ссылке, следует использовать следующий синтаксис:


fn&($x) => $x

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

Нет многострочности

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

Аргументация такова: цель коротких замыканий - уменьшить многословие. fn конечно короче чем function во всех случаях. Однако Никита Попов, создатель RFC, утверждал, что если вы работаете с многострочными функциями, то с помощью коротких замыканий можно получить меньше кода.

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

Согласны ли вы с этим мнением, зависит от вас. Хоть, конечно, я бы мог применить однострочные замыкания в некоторых моих проектах, но есть также много многострочных, где я лично пропущу короткий синтаксис в этих случаях.

Хотя есть надежда: в будущем в короткие замыкания будет добавлена возможность использовать несколько строк, но это будет уже другая история и RFC.

Значения из внешней области видимости

Еще одно существенное различие между короткими и обычными замыканиями заключается в том, что для коротких не требуется ключевое слово use для доступа к данным из внешней области видимости.


$modifier = 5;

array_map(fn($x) => $x * $modifier, $numbers);

Важно отметить, что вы не можете изменять переменные из внешней области видимости. Это означает, что вы можете изменить значение переменной $modifier в пределах короткого замыкания, и это не повлияет на переменную $modifier во внешней области видимости.

Единственное исключение, конечно, $this, которое действует точно так же, как и в обычных замыканиях:


array_map(fn($x) => $x * $this->modifier, $numbers);

Возможные будущие фичи 

Я уже упоминал о многострочных коротких замыканиях, у которых есть шанс появиться в будущем. Еще одна идея - использование короткого замыкания в классах, например для  геттеров и сеттеров:


class Post {
    private $title;
 
    fn getTitle() => $this->title;
}


В общем, короткие замыкания являются хорошей фичей, хотя есть еще хотелки, которые можно улучшить. Самой желанной из них, вероятно, являются появление многострочных коротких замыканий.


UPD 05.05.2019

Кстати, разработчики фреймворка Laravel быстро отреагировали на появление коротких замыканий в PHP 7.4 и сделали их будущую поддержку, пример:


// Current
$users->map(function($user) {
    return $user->first_name.' '.$user->last_name;
});

// with arrow function:
$users->map(
    fn($user) => $user->first_name.' '.$user->last_name
);



Что думаешь?

Категории
  • PHP 66
  • Заметки 15
  • Безопасность 3
  • Флуд 2
  • Nginx 2
  • ИТ новости 2
  • Видео 1
  • Docker 1
  • Roadmap 1
  • Архитектура 0

Хочешь поддержать сайт?

Делаем из мухи слона

sergeymukhin.com

персональный блог о веб-разработке от Сергея Мухина. Блог был основан в 2018 году, и собирался уделять основное внимание последним тенденциям, учебным пособиям, а также советам и рекомендациям, позволяющим начинающим девелоперам встать быстрее на правильную дорогу веб разработки, но что-то пошло не так 😃

Релизы PHP 8.4

Дата Релиз
8 Июня 2024 Альфа 1
20 Июня 2024 Альфа 2
04 Июля 2024 Альфа 3
16 Июля 2024 Feature freeze
18 Июля 2024 Бета 1
01 Августа 2024 Бета 2
15 Августа 2024 Бета 3
29 Августа 2024 RC 1
12 Сентября 2024 RC 2
26 Сентября 2024 RC 3
10 Октября 2024 RC 4
24 Октября 2024 RC 5
07 Ноября 2024 RC 6
21 Ноября 2024 GA

Что нового?