Стрелочные функции были представлены в 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
?>
0 комментариев