W3docs

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); // 16

Captura 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:

php— editable, runs on the server

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; // 7

Para 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áveisAutomática, por valorExplícita via use
CorpoExpressão únicaBloco de declarações completo
Palavra-chave returnImplícitaNecessária
Captura por referênciaNãoSim, com use (&$var)
Disponível desdePHP 7.4PHP 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.

Prática

Prática
Quais são as características das funções PHP conforme descrito no artigo na URL fornecida?
Quais são as características das funções PHP conforme descrito no artigo na URL fornecida?
Was this page helpful?