Menu

Стрелочные функции PHP: синтаксис fn() => и примеры

Стрелочная функция это анонимная функция из одного выражения вида fn($x) => $x * 2. Она использует внешние переменные автоматически, по значению, без use. Синтаксис, как работает захват, типы, колбэки для array_map и usort и когда лучше взять полноценное замыкание.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Стрелочная функция это короткая анонимная функция: fn($x) => $x * 2. Тело после => это одно выражение, значение которого возвращается, а любая переменная окружающего кода, которую использует выражение, захватывается автоматически, по значению. Стрелочные функции существуют с PHP 7.4 и в основном используются как колбэки.

Синтаксис

fn, список параметров, =>, одно выражение. Типы параметров, значения по умолчанию и тип возвращаемого значения работают так же, как в обычных функциях:

Ключевого слова return и фигурных скобок нет. Длинное выражение для читаемости всё равно можно разбить на несколько строк.

Внешние переменные захватываются по значению

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

В этом главное отличие от function () use (&$count), которая может разделять переменную по ссылке. Стрелочная функция не может переприсвоить внешнюю переменную. Но она может изменить захваченный объект (копия это дескриптор того же объекта), а параметр, объявленный по ссылке, работает как в любой функции: fn(array &$list) => $list[] = 'x'.

Колбэки для array_map, array_filter и usort

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

<=> возвращает -1, 0 или 1, ровно то, что нужно usort(), поэтому сортировка по полю помещается в одну строку. Поменяйте $a и $b местами, чтобы сортировать по убыванию.

Стрелочные функции, которые возвращают стрелочные функции

Среди захваченных переменных есть и параметры внешней стрелочной функции, поэтому их можно вкладывать и строить функции из других значений:

Обратите внимание, что array_filter() сохраняет исходные ключи, поэтому результат начинается с индекса 1.

fn и function: когда нужно полноценное замыкание

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

fn($x) => ...function ($x) use ($y) { ... }
Телоодно выражениелюбые инструкции
Возвратавтоматическийявный return
Внешние переменныевсе используемые, автоматическитолько перечисленные в use
Захват по ссылкенетда, use (&$y)
Доступно сPHP 7.4PHP 5.3

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

Часто задаваемые вопросы

Что такое стрелочная функция в PHP?

Короткая анонимная функция, появившаяся в PHP 7.4: fn($x) => $x * 2. Её тело это одно выражение, значение которого возвращается автоматически, и она может читать переменные из окружающей области видимости без use.

Может ли стрелочная функция PHP занимать несколько строк?

Нет. Тело после => должно быть одним выражением; блока с инструкциями нет. Длинное выражение можно разбить на строки, но если нужны if, циклы или несколько инструкций, используйте function () use (...) { ... }.

Может ли стрелочная функция изменить внешнюю переменную?

Нет. Стрелочные функции захватывают внешние переменные по значению, поэтому fn() => $count++ меняет только свою копию, а $count снаружи остаётся прежней. Чтобы изменить внешнюю переменную, используйте замыкание с use (&$count).

Чем fn отличается от function в PHP?

fn($x) => ... содержит одно выражение, неявно его возвращает и захватывает по значению каждую используемую внешнюю переменную. function ($x) use ($y) { ... } может содержать любые инструкции, требует явного return и видит только переменные, перечисленные в use, причём их можно захватить по ссылке.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ