Introdução à programação funcional em PHP
Programação funcional (PF) é um paradigma no qual os cálculos são tratados como a avaliação de funções matemáticas, evitando a mudança de estado e dados mutáveis. Embora o PHP tenha sido originalmente criado como uma linguagem imperativa, a partir da versão 5.3 (2009), foram adicionadas ferramentas poderosas para o estilo funcional: funções anônimas, closures, suporte a funções de alta ordem e muito mais.
Neste artigo, abordaremos todos os conceitos-chave da programação funcional em PHP — desde funções anônimas básicas até técnicas avançadas como currying e composição de funções. Você aprenderá a escrever um código mais limpo, previsível e testável.
1. Funções anônimas e closures
Funções anônimas
Uma função anônima (lambda) é uma função sem nome. Ela pode ser atribuída a uma variável, passada como argumento ou retornada de outra função.
<?php// Função anônima comum$square = function($n) { return $n * $n;};
echo $square(5); // 25
// Função anônima como callback para array_map$numbers = [1, 2, 3, 4];$squared = array_map(function($n) { return $n * $n;}, $numbers);
print_r($squared); // [1, 4, 9, 16]?>Closures
Uma closure é uma função anônima que pode capturar variáveis do escopo externo usando a palavra-chave use. Este é um dos recursos mais poderosos da PF em PHP.
<?php$multiplier = 3;
$multiply = function($n) use ($multiplier) { return $n * $multiplier;};
echo $multiply(10); // 30
// Variável mutável (passada por referência)$counter = 0;$increment = function() use (&$counter) { $counter++;};
$increment();$increment();echo $counter; // 2?>2. Funções puras e imutabilidade de dados
Funções puras
Uma função pura é uma função que:
- Sempre retorna o mesmo resultado para os mesmos argumentos (determinística)
- Não tem efeitos colaterais (não altera variáveis externas, não imprime dados, não interage com o banco de dados)
<?php// NÃO é uma função pura (depende de uma variável global)$taxRate = 0.2;function calculatePriceDirty($price) { global $taxRate; return $price * (1 + $taxRate);}
// Função purafunction calculatePricePure($price, $taxRate) { return $price * (1 + $taxRate);}
echo calculatePricePure(100, 0.2); // 120 — sempre previsível?>Imutabilidade
Na PF, é comum não modificar dados existentes, mas sim criar novos. Em PHP, você pode usar objetos imutáveis ou simplesmente retornar novos arrays.
<?php// Ruim: modificar o array original$numbers = [1, 2, 3];array_push($numbers, 4); // mutação
// Bom: criar um novo array$numbers = [1, 2, 3];$newNumbers = array_merge($numbers, [4]);
// Função que retorna um novo arrayfunction addItem(array $arr, $item): array { $result = $arr; $result[] = $item; return $result;}
$original = [1, 2];$updated = addItem($original, 3);print_r($original); // [1, 2] — original não foi alteradoprint_r($updated); // [1, 2, 3]?>3. Funções de alta ordem: array_map, array_filter, array_reduce
Funções de alta ordem são funções que recebem outras funções como argumentos ou as retornam. O PHP possui três funções-chave para trabalhar com arrays no estilo funcional.
array_map — transformação de elementos
<?php$users = [ ['name' => 'Alice', 'age' => 25], ['name' => 'Bob', 'age' => 30],];
// Extraindo apenas os nomes$names = array_map(function($user) { return $user['name'];}, $users);
print_r(