Programación funcional en PHP

Al parecer, todos los lenguajes de programación están incorporando características funcionales (Java es otro ejemplo). Este es un breve repaso de las características funcionales de PHP, agregadas en las últimas versiones.

Asignar una función a una variable


<?php

$func = function($message) {

  if ($message) {
    echo $message."\n";
  } else {
    echo "This is a function\n";
  }
}; // nótese que el ';' al final de esta llave es necesario!

Diferentes formas de llamar a la función


call_user_func($func);
$func('Custom message');
call_user_func($func, 'Custom message 2');

Funciones lambda / anónimas, in-line

function func1($items, $func2) {
 foreach($items as $item) {
    call_user_func($func2, $item);
 }
}

$items = array('item1', 'item2', 'item3');
 func1($items, function($item) {
echo $item."\n";
} );

Closures

function constantSum($par1, $par2) {
    return function($number) use ($par1, $par2) {
        return $number + $par1 + $par2;
    };
}

$func = constantSum(2, 3);
// 2 + 3 + 5 = 10
echo $func(5)."\n";

Los argumentos se pasan por valor, pero pueden ser pasados por referencia

Extraído de [https://wiki.php.net/rfc/closures]

$x = 1;
$lambda1 = function () use ($x) {
    $x *= 2;
};
$lambda2 = function () use (&$x) {
    $x *= 3;
};
$lambda1 ();
var_dump ($x); // gives: 1
$lambda2 ();
var_dump ($x); // gives: 3

Invocar objetos como si fueran funciones

Ahora todos los objetos pueden ser funciones! Sólo necesitás implementar el método __invoke()

class ObjectOrFunction {
    public function __invoke() {
        echo "I'm being invoked as a function... what I am??\n";
    }
}
$obj = new ObjectOrFunction();
$obj();
Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s