Programación funcional en PHP: de la teoría a la práctica
PHP se asocia tradicionalmente con enfoques imperativos y orientados a objetos, sin embargo, el lenguaje moderno proporciona herramientas potentes para la programación funcional (FP). En este artículo, analizaremos cómo aplicar los principios de FP en PHP: desde funciones anónimas hasta currying e inmutabilidad. Aprenderá cómo hacer que el código sea más predecible, comprobable y conciso.
1. Fundamentos: funciones anónimas y closures
Las funciones anónimas (lambdas) son la piedra angular de FP en PHP. Permiten pasar comportamiento como datos.
<?php// Función anónima simple$greet = function($name) { return "¡Hola, $name!";};echo $greet('Mundo'); // ¡Hola, Mundo!
// Uso con array_map$numbers = [1, 2, 3, 4, 5];$squared = array_map(function($n) { return $n * $n;}, $numbers);print_r($squared); // [1, 4, 9, 16, 25]?>Closures son funciones anónimas que capturan variables del ámbito externo usando la palabra clave use:
<?php$factor = 3;$multiply = function($n) use ($factor) { return $n * $factor;};echo $multiply(5); // 15
// Closure con variable mutable (por referencia)$counter = 0;$increment = function() use (&$counter) { $counter++;};$increment();echo $counter; // 1?>Los closures son indispensables al crear funciones callback y fábricas.
2. Funciones de orden superior: array_map, array_filter, array_reduce
PHP incluye funciones clásicas de orden superior que aceptan otras funciones como argumentos:
array_map— transforma cada elemento de un array;array_filter— filtra elementos según una condición;array_reduce— reduce un array a un solo valor.
<?php$data = [1, 2, 3, 4, 5, 6];
// Filtrar números pares$even = array_filter($data, function($n) { return $n % 2 === 0;}); // [2, 4, 6]
// Duplicar cada elemento$doubled = array_map(function($n) { return $n * 2;}, $even); // [4, 8, 12]
// Suma de todos los valores$sum = array_reduce($doubled, function($carry, $n) { return $carry + $n;}, 0); // 24?>Tenga en cuenta: array_filter conserva las claves. Si necesita reindexar, use array_values().
3. Inmutabilidad y trabajo con datos
La programación funcional fomenta la inmutabilidad — la invariabilidad de los datos. En lugar de modificar objetos existentes, se crean nuevos.
<?php// Enfoque imperativo (mutación)$user = ['name' => 'Iván', 'age' => 25];$user['age'] = 26; // modificamos el array original
// Enfoque funcional (inmutable)$user = ['name' => 'Iván', 'age' => 25];$updatedUser = array_merge($user, ['age' => 26]); // nuevo array?>Para trabajar con arrays, use array_merge, array_slice y el operador spread (PHP 7.4+):
<?php$original = [1, 2, 3];$new = [...$original, 4]; // [1, 2, 3, 4] — el original no cambió?>La inmutabilidad simplifica la depuración y hace que el código sea seguro para subprocesos.
4. Currying y aplicación parcial
Currying — transformar una función de varios argumentos en una secuencia de funciones de un solo argumento. Aplicación parcial — fijar parte de los argumentos.
PHP no tiene currying incorporado, pero es fácil de implementar:
<?php// Función de suma currificadafunction curryAdd($a) { return function($b) use ($a) { return function($c) use ($a, $b) { return $a + $b + $c; }; };}
$add5 = curryAdd(5);