Стрелочные функции были представлены в PHP 7.4 как более краткий синтаксис для анонимных функций .

И анонимные функции, и стрелочные функции реализованы с использованием Класс закрытия .

Стрелочные функции имеют базовую форму fn (argument_list) => expr.

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

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

Пример #1 Стрелочные функции автоматически захватывают переменные по значению

<?php

$y = 1;
 
$fn1 = fn($x) => $x + $y;
// equivalent to using $y by value:
$fn2 = function ($x) use ($y) {
    return $x + $y;
};

var_export($fn1(3));
?>

Приведенный выше пример выведет: 4

Это также работает, если стрелочные функции вложены:

Пример #2 Стрелочные функции автоматически захватывают переменные по значению, даже если они вложены

<?php

$z = 1;
$fn = fn($x) => fn($y) => $x * $y + $z;
// Outputs 51
var_export($fn(5)(10));
?>

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

Example #3 Примеры стрелочных функций

<?php

fn(array $x) => $x;
static fn(): int => $x;
fn($x = 42) => $x;
fn(&$x) => $x;
fn&($x) => $x;
fn($x, ...$rest) => $rest;

?>

Стрелочные функции используют привязку переменных по значению. Это примерно эквивалентно выполнению a use($x)для каждой переменной $x , используемой внутри стрелочной функции. Привязка по значению означает, что невозможно изменить какие-либо значения из внешней области. Вместо этого для привязки по ссылке можно использовать анонимные функции.

Пример #4 Значения из внешней области видимости не могут быть изменены стрелочными функциями

<?php

$x = 1;
$fn = fn() => $x++; // Has no effect
$fn();
var_export($x);  // Outputs 1

?>