Uma arrow function é uma função anônima curta: fn($x) => $x * 2. O corpo depois do => é uma única expressão cujo valor é retornado, e qualquer variável do código em volta que a expressão usa é capturada automaticamente, por valor. Arrow functions existem desde o PHP 7.4 e são usadas principalmente como callbacks.
A sintaxe
fn, a lista de parâmetros, =>, uma expressão. Tipos de parâmetro, valores padrão e um tipo de retorno funcionam como nas funções normais:
Não há palavra-chave return nem chaves. Uma expressão longa ainda pode ser quebrada em várias linhas para ficar legível.
Variáveis de fora são capturadas por valor
Uma arrow function enxerga todas as variáveis do escopo em que é criada. Ela copia os valores naquele momento. Mudanças feitas dentro ficam dentro, e mudanças feitas fora depois que a função foi criada não são vistas:
Essa é a principal diferença para function () use (&$count), que pode compartilhar uma variável por referência. Uma arrow function não consegue reatribuir uma variável de fora. Ela ainda pode alterar um objeto que capturou (a cópia é um handle para o mesmo objeto), e um parâmetro declarado por referência funciona como em qualquer função: fn(array &$list) => $list[] = 'x'.
Callbacks para array_map, array_filter e usort
A maioria das funções de array recebe um callback, e é aí que as arrow functions mais economizam ruído. Compare um filtro escrito dos dois jeitos:
<=> retorna -1, 0 ou 1, exatamente o que o usort() quer, então ordenar por um campo cabe numa linha. Troque $a e $b para ordenar em ordem decrescente.
Arrow functions que retornam arrow functions
As variáveis capturadas incluem os parâmetros de uma arrow function externa, então você pode aninhá-las para montar funções a partir de outros valores:
Repare que o array_filter() mantém as chaves originais, e é por isso que o resultado começa no índice 1.
fn ou function: quando você precisa de uma closure completa
Arrow functions deixam de servir quando o corpo precisa de mais de uma expressão ou precisa alterar uma variável de fora. Aí use uma função anônima:
fn($x) => ... | function ($x) use ($y) { ... } | |
|---|---|---|
| Corpo | uma expressão | quaisquer instruções |
| Retorno | automático | return explícito |
| Variáveis de fora | todas as usadas, automaticamente | só as listadas no use |
| Captura por referência | não | sim, use (&$y) |
| Disponível desde | PHP 7.4 | PHP 5.3 |
Quando uma arrow function parece apertada, muitas vezes é porque a tarefa são duas tarefas. Dividi-la num filtro e numa soma, como acima, mantém cada callback como uma única expressão.
Perguntas frequentes
O que é uma arrow function no PHP?
Uma função anônima curta introduzida no PHP 7.4: fn($x) => $x * 2. O corpo é uma única expressão cujo valor é retornado automaticamente, e ela pode ler variáveis do escopo em volta sem uma cláusula use.
Uma arrow function do PHP pode ter várias linhas?
Não. O corpo depois do => precisa ser uma expressão; não existe bloco com instruções. Você pode quebrar uma expressão longa em várias linhas, mas se precisar de if, loops ou várias instruções, use function () use (...) { ... }.
Uma arrow function pode alterar uma variável de fora?
Não. Arrow functions capturam variáveis de fora por valor, então fn() => $count++ só altera a própria cópia e $count lá fora continua igual. Para alterar uma variável de fora, use uma closure com use (&$count).
Qual a diferença entre fn e function no PHP?
fn($x) => ... tem uma expressão, a retorna implicitamente e captura por valor toda variável de fora que usa. function ($x) use ($y) { ... } pode ter quaisquer instruções, precisa de um return explícito e só enxerga as variáveis listadas no use, que podem ser capturadas por referência.