Programación funcional en PHP: técnicas avanzadas y ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Programación funcional en PHP: nivel avanzado



PHP se asocia tradicionalmente con estilos imperativos y orientados a objetos, sin embargo, el lenguaje moderno (especialmente desde la versión 7.4 en adelante) proporciona herramientas potentes para aplicar el paradigma funcional. En este artículo, analizaremos conceptos avanzados de programación funcional (FP) en PHP que ayudarán a escribir código más predecible, comprobable y expresivo.



1. Funciones puras e inmutabilidad de datos



En la base de la FP se encuentran las funciones puras — funciones que:

  • Dependen únicamente de sus argumentos (no utilizan variables globales ni estado fuera del ámbito de visibilidad);
  • No provocan efectos secundarios (no modifican datos externos, no escriben en archivos, no envían solicitudes HTTP);
  • Para los mismos datos de entrada siempre devuelven el mismo resultado.


En PHP, para garantizar la pureza de las funciones, se aplica activamente la inmutabilidad de datos. En lugar de mutar arrays u objetos existentes, se crean copias de ellos con los cambios.



<?php// Función impura (utiliza un array global)$globalData = [1, 2, 3];function addElementImpure($value) {    global $globalData;    $globalData[] = $value; // Efecto secundario    return $globalData;}

// Función pura (devuelve un nuevo array)function addElementPure(array $data, $value): array { $newData = $data; $newData[] = $value; return $newData;}

$original = [1, 2, 3];$modified = addElementPure($original, 4);// $original sigue siendo [1, 2, 3], $modified = [1, 2, 3, 4]?>


2. Closures (cierres) y captura de variables



Los closures en PHP son funciones anónimas que pueden capturar variables del ámbito padre mediante la palabra clave use. Esta es la base para crear funciones de orden superior.



Es importante distinguir entre la captura por valor (por defecto) y por referencia (&use). En el contexto de la FP, es preferible la captura por valor para no violar la pureza.



<?php$multiplier = 3;

// Closure que captura $multiplier por valor$multiply = function ($value) use ($multiplier) { return $value * $multiplier;};

echo $multiply(5); // 15

// Ejemplo de función de orden superior que devuelve un closurefunction createGreeter(string $greeting): Closure { return function (string $name) use ($greeting) { return "{$greeting}, {$name}!"; };}

$sayHello = createGreeter('Hello');echo $sayHello('World'); // Hello, World!?>


3. Currying (Currificación) y aplicación parcial



Currying es la transformación de una función que toma varios argumentos en una secuencia de funciones, cada una de las cuales toma un solo argumento. Aplicación parcial es la fijación de una parte de los argumentos para obtener una nueva función con un número menor de parámetros.



PHP no tiene soporte incorporado para currying, pero se puede implementar mediante closures.



<?php// Función normalfunction add(int $a, int $b, int $c): int {    return $a + $b + $c;}

// Versión currificada$curriedAdd = function (int $a) { return function (int $b) use ($a) { return function (int $c) use ($a, $b) { return $a + $b + $c; }; };};

echo $curriedAdd(1)(2)(3); // 6

// Aplicación parcial mediante una función auxiliarfunction partial(callable $fn, ...$fixedArgs): Closure { return function (...$remainingArgs) use ($fn, $fixedArgs) { return $fn(...array_merge($fixedArgs, $remainingArgs)); };}

$addFive = partial('add', 2, 3);echo $addFive(10); // 15 (2 + 3 + 10)?>


4. Composición de funciones y tuberías



La composición de funciones permite combinar varias funciones simples en una compleja, pasando el resu

Blogs

Book Recommendations