Стрелочные функции
Стрелочные функции появились в PHP 7.4 как
лаконичный синтаксис для анонимных функций.
И анонимные, и стрелочные функции реализовали
через класс Closure.
Базовая форма записи стрелочных функций:
fn (argument_list) => expr
.
Стрелочные функции работают так же,
как анонимные функции,
за исключением того, что доступ к переменным
родительской области стрелочные функции получают автоматически.
Когда стрелочная функция работает с переменной,
которую определили в родительской области,
переменная неявно захватывается по значению.
В следующем примере функции $fn1
и $fn2 ведут себя одинаково.
Пример #1
Стрелочные функции захватывают переменные по значению автоматически
<?php
$y = 1;
$fn1 = fn($x) => $x + $y;
// Эквивалентно получению переменной $y по значению:
$fn2 = function ($x) use ($y) {
return $x + $y;
};
var_export($fn1(3));
?>
Результат выполнения приведённого примера:
Это также работает во вложенных стрелочных функциях:
Пример #2
Стрелочные функции захватывают переменные по значению автоматически,
даже когда функции вложены
<?php
$z = 1;
$fn = fn($x) => fn($y) => $x * $y + $z;
// Выведет 51
var_export($fn(5)(10));
?>
Как и в анонимных функциях,
синтаксис стрелочных функций допускает произвольные сигнатуры функций,
включая типы параметров и возвращаемых значений, значения по умолчанию,
переменные и передачу и возврат по ссылке.
Корректные примеры стрелочных функций:
Пример #3 Примеры определения стрелочных функций
<?php
fn(array $x) => $x;
static fn($x): int => $x;
fn($x = 42) => $x;
fn(&$x) => $x;
fn&($x) => $x;
fn($x, ...$rest) => $rest;
?>
Стрелочные функции привязывают переменные по значению.
Это примерно эквивалентно выполнению конструкции use($x)
для каждой переменной $x, с которой стрелочная функция
будет работать внутри.
Привязка по значению означает, что внутри стрелочной функции невозможно
изменить значения из внешней области видимости.
Вместо этого для привязок по ссылкам можно пользоваться
анонимными функциями.
Пример #4
Стрелочные функции не умеют изменять значения из внешней области видимости
<?php
$x = 1;
$fn = fn() => $x++; // Ничего не изменит
$fn();
var_export($x); // Выведет 1
?>