fn
A palavra-chave "fn" foi introduzida no PHP 7.4 e é usada para criar arrow functions — uma sintaxe concisa para funções anônimas de expressão única.
A Palavra-chave PHP fn (Arrow Functions)
A palavra-chave fn, introduzida no PHP 7.4, cria arrow functions — uma sintaxe concisa para escrever funções anônimas de expressão única. Uma arrow function retorna o valor de uma expressão e captura automaticamente as variáveis que usa do escopo circundante. Isso a torna ideal para callbacks curtos passados a funções de array como array_map, array_filter e array_reduce.
Esta página aborda a sintaxe, como a captura de variáveis difere das closures clássicas, as principais regras e armadilhas, e exemplos práticos.
Sintaxe
Uma arrow function usa fn, uma lista de parâmetros, o operador => (fat arrow) e uma única expressão cujo valor é retornado implicitamente:
$arrowFunction = fn($parameter) => expression;Não há corpo { ... } nem declaração return — ambos são proibidos. A expressão após => é o valor de retorno.
$square = fn($n) => $n * $n;
echo $square(4); // 16Captura automática de variáveis (sem necessidade de use)
A maior diferença em relação a uma closure clássica (function () use (...) { ... }) é que uma arrow function captura automaticamente por valor cada variável do escopo pai que ela referencia. Você nunca escreve uma cláusula use:
Como a captura é somente por valor, as arrow functions não podem modificar uma variável externa por referência. Se precisar disso, use uma closure completa com use (&$var).
Exemplos
Arrow functions se destacam como callbacks de uma linha. A expressão é retornada automaticamente, portanto nenhum return é necessário.
<?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; // 7Para saber mais sobre como passar funções como callbacks, veja funções callback PHP.
Regras e armadilhas
- Apenas uma expressão. Arrow functions não podem conter declarações, loops ou múltiplas linhas. Se sua lógica precisar de um bloco, use uma closure completa com
function () use (...) { ... }. - Captura por valor. Modificar uma variável capturada dentro da arrow function não afeta a externa, e alterações posteriores na variável externa não são vistas.
- Sem captura por referência. Você não pode usar
use (&$var); use uma closure completa quando precisar modificar o estado externo. - Type hints e valores padrão são permitidos:
fn(int $n = 0): int => $n + 1. - Apenas PHP 7.4+. Em versões mais antigas, volte a usar
function () use (...) { ... }.
fn vs. function (closures)
Arrow function (fn) | Closure (function) | |
|---|---|---|
| Captura de variáveis | Automática, por valor | Explícita via use |
| Corpo | Expressão única | Bloco de declarações completo |
Palavra-chave return | Implícita | Necessária |
| Captura por referência | Não | Sim, com use (&$var) |
| Disponível desde | PHP 7.4 | PHP 5.3 |
Use fn quando tiver um callback curto de expressão única. Use uma closure completa quando precisar de múltiplas declarações, captura por referência ou quiser ser explícito sobre o que captura.
Veja também: funções PHP · escopo de variáveis.