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

?>
Version Description 7.4.0 Arrow functions became available.

Зауваження: Ви можете використовувати func_num_args(), func_get_arg() і func_get_args() всередині функції стрілки.