Da trilha de PHP Este conceito ainda não saiu como card do dia. ir para o card de hoje

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 use para capturar variáveis externas; arrow functions (fn) capturam automaticamente por valor.
  • O tipo callable aceita strings, arrays, closures e arrow functions.
  • A sintaxe funcao(...) (PHP 8.1+) cria um Closure a partir de qualquer callable.
  • Arrow functions são ideais para callbacks curtos; closures para lógica mais complexa ou captura por referência.
  • use pode capturar por referência com &, permitindo modificar a variável externa.
closures_arrow.php
<?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);

Exercícios

  1. 1
    Fácil

    Saudação com closure e use

    Crie uma closure que recebe um nome e imprime uma saudação usando uma variável externa $saudacao. A closure deve capturar $saudacao com use.

    Resolver
  2. 2
    Médio

    Filtrar e transformar com callable

    Escreva uma função processar que recebe um array e dois callables: um filtro e um transformador. Ela deve filtrar os elementos com o filtro e depois aplicar o transformador, retornando o novo array. Use arrow functions para definir os callables.

    Resolver
  3. 3
    Desafio

    Composição de funções com first-class callable

    Crie uma função compor que recebe um número variável de callables e retorna uma closure que aplica todas as funções da direita para a esquerda. Use a sintaxe de first-class callable (funcao(...)) para passar funções nativas como strtoupper, trim e strrev. Teste com uma string.

    Resolver

Continue estudando