Introducción a la programación funcional en PHP
La programación funcional (PF) es un paradigma en el que los cálculos se consideran como la evaluación de funciones matemáticas, evitando cambios de estado y datos mutables. Aunque PHP fue creado originalmente como un lenguaje imperativo, a partir de la versión 5.3 (2009) se agregaron potentes herramientas para el estilo funcional: funciones anónimas, clausuras, soporte para funciones de orden superior y mucho más.
En este artículo, analizaremos todos los conceptos clave de la programación funcional en PHP, desde funciones anónimas básicas hasta técnicas avanzadas como la currificación y la composición de funciones. Aprenderá a escribir código más limpio, predecible y comprobable.
1. Funciones anónimas y clausuras (Closures)
Funciones anónimas
Una función anónima (lambda) es una función sin nombre. Puede asignarse a una variable, pasarse como argumento o devolverse desde otra función.
<?php// Función anónima normal$square = function($n) { return $n * $n;};
echo $square(5); // 25
// Función 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]?>Clausuras (Closures)
Una clausura es una función anónima que puede capturar variables del ámbito externo usando la palabra clave use. Esta es una de las características más potentes de la PF en PHP.
<?php$multiplier = 3;
$multiply = function($n) use ($multiplier) { return $n * $multiplier;};
echo $multiply(10); // 30
// Variable mutable (pasada por referencia)$counter = 0;$increment = function() use (&$counter) { $counter++;};
$increment();$increment();echo $counter; // 2?>2. Funciones puras e inmutabilidad de datos
Funciones puras
Una función pura es una función que:
- Siempre devuelve el mismo resultado para los mismos argumentos (determinista)
- No tiene efectos secundarios (no modifica variables externas, no imprime datos, no trabaja con la base de datos)
<?php// Función NO pura (depende de una variable global)$taxRate = 0.2;function calculatePriceDirty($price) { global $taxRate; return $price * (1 + $taxRate);}
// Función purafunction calculatePricePure($price, $taxRate) { return $price * (1 + $taxRate);}
echo calculatePricePure(100, 0.2); // 120 — siempre predecible?>Inmutabilidad (Immutability)
En PF, es habitual no modificar los datos existentes, sino crear otros nuevos. En PHP, para esto se pueden usar objetos inmutables o simplemente devolver nuevos arrays.
<?php// Malo: modificar el array original$numbers = [1, 2, 3];array_push($numbers, 4); // mutación
// Bueno: crear un nuevo array$numbers = [1, 2, 3];$newNumbers = array_merge($numbers, [4]);
// Función que devuelve un nuevo arrayfunction addItem(array $arr, $item): array { $result = $arr; $result[] = $item; return $result;}
$original = [1, 2];$updated = addItem($original, 3);print_r($original); // [1, 2] — el original no cambióprint_r($updated); // [1, 2, 3]?>3. Funciones de orden superior: array_map, array_filter, array_reduce
Las funciones de orden superior son funciones que toman otras funciones como argumentos o las devuelven. PHP tiene tres funciones clave integradas para trabajar con arrays en estilo funcional.
array_map — transformación de elementos
<?php$users = [ ['name' => 'Alice', 'age' => 25], ['name' => 'Bob', 'age' => 30],];
// Extraemos solo los nombres$names = array_map(function($user) { return $user['name'];}, $users);
print_r(