W3docs

fn

Ключевое слово fn появилось в PHP 7.4 для создания стрелочных функций — краткого синтаксиса для анонимных функций с автозахватом переменных.

Ключевое слово PHP fn (стрелочные функции)

Ключевое слово fn, появившееся в PHP 7.4, создаёт стрелочные функции — лаконичный синтаксис для написания однострочных анонимных функций. Стрелочная функция возвращает значение одного выражения и автоматически захватывает переменные из внешней области видимости. Это делает её идеальной для коротких колбэков, передаваемых в такие функции для работы с массивами, как array_map, array_filter и array_reduce.

Эта страница охватывает синтаксис, отличия захвата переменных от классических замыканий, основные правила и особенности, а также практические примеры.

Синтаксис

Стрелочная функция использует fn, список параметров, оператор => (толстая стрелка) и одно выражение, значение которого возвращается неявно:

$arrowFunction = fn($parameter) => expression;

Тело { ... } и оператор return отсутствуют — оба запрещены. Выражение после => является возвращаемым значением.

$square = fn($n) => $n * $n;
echo $square(4); // 16

Автоматический захват переменных (без use)

Главное отличие от классического замыкания (function () use (...) { ... }) состоит в том, что стрелочная функция автоматически захватывает по значению каждую переменную из родительской области видимости, на которую она ссылается. Предложение use писать не нужно:

php— editable, runs on the server

Поскольку захват происходит только по значению, стрелочные функции не могут изменять внешнюю переменную по ссылке. Если это необходимо, используйте полное замыкание с use (&$var).

Примеры

Стрелочные функции отлично подходят в качестве однострочных колбэков. Выражение возвращается автоматически, поэтому return не нужен.

<?php

// array_reduce — sum a list
$numbers = [1, 2, 3, 4, 5];
$sum = array_reduce($numbers, fn($carry, $number) => $carry + $number);
echo $sum . PHP_EOL; // 15

// array_filter — keep names longer than 4 characters
$names = ["John", "Maryjane", "Paul", "Jane"];
$filtered = array_filter($names, fn($name) => strlen($name) > 4);
print_r($filtered); // Array ( [1] => Maryjane )

// array_map — apply 20% tax to each price
$prices = [10, 20, 30];
$withTax = array_map(fn($p) => $p * 1.2, $prices);
print_r($withTax); // Array ( [0] => 12 [1] => 24 [2] => 36 )

// Nested arrow functions (currying) — each captures from its parent
$adder = fn($x) => fn($y) => $x + $y;
echo $adder(3)(4) . PHP_EOL; // 7

Подробнее о передаче функций в качестве колбэков см. Колбэк-функции PHP.

Правила и особенности

  • Только одно выражение. Стрелочные функции не могут содержать инструкции, циклы или несколько строк. Если логика требует блока, используйте полное замыкание с function () use (...) { ... }.
  • Захват по значению. Изменение захваченной переменной внутри стрелочной функции не влияет на внешнюю, и последующие изменения внешней переменной не отражаются на функции.
  • Нет захвата по ссылке. Нельзя использовать use (&$var); при необходимости изменить внешнее состояние используйте полное замыкание.
  • Подсказки типов и значения по умолчанию допускаются: fn(int $n = 0): int => $n + 1.
  • Только PHP 7.4+. На старых версиях следует использовать function () use (...) { ... }.

fn vs. function (замыкания)

Стрелочная функция (fn)Замыкание (function)
Захват переменныхАвтоматический, по значениюЯвный через use
ТелоОдно выражениеПолный блок инструкций
Ключевое слово returnНеявныйОбязателен
Захват по ссылкеНетДа, с use (&$var)
Доступно начиная сPHP 7.4PHP 5.3

Используйте fn, когда нужен короткий однострочный колбэк. Используйте полное замыкание, когда требуется несколько инструкций, захват по ссылке или явное указание того, что захватывается.

См. также: Функции PHP · область видимости переменных.

Практика

Практика
Каковы особенности функций PHP, указанные в статье по указанному URL?
Каковы особенности функций PHP, указанные в статье по указанному URL?
Was this page helpful?