Arrow Functions

Arrow functions foram introduzidos a partir do PHP 7.4 como uma sintaxe mais concisa para funções anônimas.

Funções anônimas e arrow functions são implementadas usando a classe Closure.

Arrow functions tem a forma básica fn (argument_list) => expr.

Arrow functions possuem a mesmas características das funções anônimas, exceto que o uso de variáveis do escopo pai é sempre automático.

Quando uma variável usada na expressão é definida no escopo pai ele será implicitamente capturado por valor. No exemplo a seguir, as funções $fn1 e $fn2comportam-se da mesma maneira.

Exemplo #1 Arrow functions capturam variáveis por valor automaticamente

<?php

$y
= 1;

$fn1 = fn($x) => $x + $y;
// Equivalente ao usar $y por valor:
$fn2 = function ($x) use ($y) {
return
$x + $y;
};

var_export($fn1(3));
?>

O exemplo acima produzirá:

 4 

Isso também funciona se as arrow de functions estiverem aninhadas:

Exemplo #2 Arrow functions capturam variáveis por valor automaticamente, mesmo quando aninhadas

<?php

$z
= 1;
$fn = fn($x) => fn($y) => $x * $y + $z;
// Outputs 51
var_export($fn(5)(10));
?>

Da mesma forma que funções anônimas, a sintaxe das arrow functions permitem assinaturas de função arbitrária, incluindo parâmetros e tipos de retorno, valores padrão, variadics, bem como por referência passando e retornando. Todos os exemplos válidos de arrow functions:

Exemplo #3 Examplos de arrow functions

<?php

fn(array $x) => $x;
static fn():
int => $x;
fn(
$x = 42) => $x;
fn(&
$x) => $x;
fn&(
$x) => $x;
fn(
$x, ...$rest) => $rest;

?>

Arrow functions usam vinculação de variável por valor. Isso é aproximadamente equivalente a realizar um use($x) para cada variável $x usada dentro da arrow function. Uma passagem de variável por valor, significa que não é possível modificar quaisquer valores do escopo externo. Funções anônimas podem ser usadas em vez disso para passagem de variável por referência.

Exemplo #4 Valores do escopo externo não podem ser modificados por arrow functions

<?php

$x
= 1;
$fn = fn() => $x++; // Não tem efeito
$fn();
var_export($x); // Imprime 1

?>

Registro de Alterações

VersãoDescrição
7.4.0 Arrow functions tornou-se disponível.

Notas

Nota: É possível usar func_num_args(), func_get_arg(), e func_get_args() de dentro de uma arrow functions.

To Top