Programação Funcional em PHP: uma abordagem moderna para escrever código
O PHP é tradicionalmente associado aos estilos de programação imperativa e orientada a objetos. No entanto, com o lançamento das versões 7.4, 8.0 e 8.1, a linguagem ganhou ferramentas poderosas para programação funcional (FP). Essa abordagem paradigmática permite escrever código mais previsível, testável e conciso, especialmente ao trabalhar com arrays, coleções e tarefas assíncronas. Neste artigo, vamos explorar os conceitos-chave de FP em PHP e mostrar como aplicá-los na prática.
1. Fundamentos da Programação Funcional em PHP
A programação funcional é construída sobre vários princípios fundamentais:
- Funções puras — o resultado depende apenas dos argumentos, sem efeitos colaterais.
- Imutabilidade — os dados não são alterados, mas sim criadas novas cópias.
- Funções de ordem superior — funções que recebem outras funções como argumentos ou as retornam.
- Recursão — substituição de loops por auto-chamada de função.
O PHP suporta esses conceitos graças às funções anônimas (closures), arrow functions (desde o PHP 7.4) e funções nativas para manipulação de arrays.
// Exemplo de função purafunction add(int $a, int $b): int { return $a + $b;}
// Exemplo de função anônima (closure)$multiply = function(int $x, int $y): int { return $x * $y;};
echo $multiply(3, 4); // 12Importante: Funções puras em PHP não devem modificar variáveis globais ou realizar entrada/saída (ex.: echo). Isso garante previsibilidade e facilita a depuração.
2. Funções Anônimas, Closures e Arrow Functions
Funções anônimas (closures) são funções sem nome que podem ser passadas como argumentos ou atribuídas a variáveis. Elas podem capturar variáveis do escopo externo usando a palavra-chave use.
$factor = 2;$double = function(int $value) use ($factor): int { return $value * $factor;};
echo $double(5); // 10Com o PHP 7.4, surgiram as arrow functions — uma sintaxe mais concisa para closures de uma única linha. Elas capturam automaticamente variáveis do escopo.
$factor = 2;$double = fn(int $value): int => $value * $factor;
echo $double(5); // 10Quando usar: Arrow functions são ideais para transformações simples (ex.: em array_map), enquanto closures clássicas são melhores para lógica complexa com múltiplas instruções.
3. Funções de Ordem Superior: map, filter, reduce
No PHP, para trabalhar com arrays de forma funcional, usamos funções nativas:
array_map()— aplica uma função a cada elemento do array.array_filter()— filtra o array com base em uma condição.array_reduce()— reduz o array a um único valor.
$numbers = [1, 2, 3, 4, 5, 6];
// map: dobrar cada elemento$doubled = array_map(fn($n) => $n * 2, $numbers);print_r($doubled); // [2, 4, 6, 8, 10, 12]
// filter: manter apenas os pares$even = array_filter($numbers, fn($n) => $n % 2 === 0);print_r(array_values($even)); // [2, 4, 6]
// reduce: soma de todos os elementos$sum = array_reduce($numbers, fn($carry, $n) => $carry + $n, 0);echo $sum; // 21Dica: Use array_values() após array_filter() para redefinir as chaves do array, caso contrário elas podem ficar não sequenciais.
Essas funções permitem substituir loops foreach por cadeias de chamadas declarativas, tornando o código mais legível e menos propenso a erros.