PHP Funções Intermediário
Closures e arrow functions
Em PHP, closures (funções anônimas) e arrow functions (fn) permitem criar funções sem nome, que podem ser armazenadas em variáveis, passadas como argumentos e retornadas de outras funções. Closures capturam variáveis do escopo externo explicitamente com use, enquanto arrow functions capturam automaticamente por valor.
Ambas implementam o tipo callable, que pode ser usado em assinaturas de funções e métodos para aceitar qualquer coisa que possa ser chamada (nome de função, método estático, closure, etc.). Desde o PHP 8.1, a first-class callable syntax (strlen(...)) cria um objeto Closure a partir de qualquer função ou método, facilitando o uso de callables como valores.
Neste card, você vai aprender a sintaxe, as diferenças de captura e como aplicar esses recursos em código real, como ordenação personalizada e composição de funções.
Pontos-chave
- Closures usam
usepara capturar variáveis externas; arrow functions (fn) capturam automaticamente por valor. - O tipo
callableaceita strings, arrays, closures e arrow functions. - A sintaxe
funcao(...)(PHP 8.1+) cria umClosurea partir de qualquer callable. - Arrow functions são ideais para callbacks curtos; closures para lógica mais complexa ou captura por referência.
usepode capturar por referência com&, permitindo modificar a variável externa.
<?php
// Exemplo 1: Closure com use
$mensagem = "Olá";
$imprimir = function($nome) use ($mensagem) {
echo "$mensagem, $nome!\n";
};
$imprimir("Maria"); // Olá, Maria!
// Exemplo 2: Arrow function (captura automática)
$multiplicador = 3;
$multiplicar = fn($x) => $x * $multiplicador;
echo $multiplicar(5) . "\n"; // 15
// Exemplo 3: Passando callable como argumento
function aplicar(callable $fn, array $valores): array {
return array_map($fn, $valores);
}
$quadrado = fn($n) => $n ** 2;
print_r(aplicar($quadrado, [1, 2, 3])); // [1, 4, 9]
// Exemplo 4: First-class callable syntax
$tamanho = strlen(...);
echo $tamanho("PHP") . "\n"; // 3
// Exemplo 5: Ordenação com closure
$pessoas = [
['nome' => 'Ana', 'idade' => 30],
['nome' => 'João', 'idade' => 25],
];
usort($pessoas, fn($a, $b) => $a['idade'] <=> $b['idade']);
print_r($pessoas);