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 писать не нужно:
Поскольку захват происходит только по значению, стрелочные функции не могут изменять внешнюю переменную по ссылке. Если это необходимо, используйте полное замыкание с 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.4 | PHP 5.3 |
Используйте fn, когда нужен короткий однострочный колбэк. Используйте полное замыкание, когда требуется несколько инструкций, захват по ссылке или явное указание того, что захватывается.
См. также: Функции PHP · область видимости переменных.