Arrow Functions
Оновлено: 11.05.2023
Функції зі стрілками було введено в PHP 7.4 як більш стислий синтаксис для анонімних функцій.
Як анонімні функції, так і функції зі стрілками реалізуються за допомогою класу Closure.
Стрілочні функції мають базову форму fn (список_аргументів) => 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));
?>
Це також працює, якщо функції стрілок є вкладеними:
Приклад #2 Стрілочні функції автоматично захоплюють змінні за значенням, навіть якщо вони вкладені
<?php
$z = 1;
$fn = fn($x) => fn($y) => $x * $y + $z;
// Outputs 51
var_export($fn(5)(10));
?>
Подібно до анонімних функцій, синтаксис стрілочних функцій дозволяє створювати довільні сигнатури функцій, включаючи типи параметрів і повернень, значення за замовчуванням, варіації, а також передачу і повернення за допомогою посилань. Усі наведені нижче приклади є правильними прикладами стрілочних функцій:
Приклад #3 Приклади стрілочних функцій
<?php
fn(array $x) => $x;
static fn(): 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++; // Has no effect
$fn();
var_export($x); // Outputs 1
?>
Зауваження: Ви можете використовувати func_num_args(), func_get_arg() і func_get_args() всередині функції стрілки.