Lambda functions y closures en PHP

Con la versión de PHP 5.3, aparte de los namespaces, otra de las funcionalidades más importantes que se añadieron fue el soporte a las funciones anónimas y los closures. En este post voy a explicar un poco que es cada cosa y como podemos utilizarlo.

Lambda Functions

Las funciones Lambda, (o funciones anónimas), simplemente son aquellas funciones que no tienen nombre. Son muy utilizadas en lenguajes como Javascript. La forma de declarar una función anónima sería la siguiente:

$c = function($a, $b) {
    return sqrt(pow(a, 2) + pow(b, 2));
}

echo $c;

De esta manera, vemos que estamos guardando en $c una referencia a la función anónima. Ahora la pregunta, ¿para que utilizaremos las funciones lambda?. Este tipo de funciones son sobretodo útiles para utilizar callbacks en nuestros métodos. Podemos crear algo parecido a esto:

function greet($value, $callback) {
    echo $callback($value);
}

greet(’ZonaDev’, function($name) {
    return "Hello, $name";
}); 

En este ejemplo, primero definimos la función greet, con dos parámetros, de los cuales el segundo será un callback (una función anónima). En el momento de llamar a la función greet, vemos como le pasamos el nombre y una función anónima que se ejecutará cuando llamamos a echo $callback($value);

Closures

Vamos a ir ahora con las closures, que no son más que funciones anónimas. La única diferencia, es que estas necesitan conocer el valor de alguna variable que se encuentra fuera de la función anónima para realizar sus procesos. Para poder pasarle a una closure una variable externa que utilizará, vamos a utilizar use, vayamos con un ejemplo:

//Simple math class 
class Math
{
    function  __construct($a) {
        $this->a =$a;
    }
    //Returns a closure
    function mul()
    {
        //We can't directly use $this inside closure
        $self = $this;
        return function($n) use($self) {
            return $n*$self->a;
        };
    }
}
$math = new Math(5);
$mul = $math->mul();
echo $mul(4); //Output : 20

En este caso, vemos como dentro de mul creamos una closure y le pasamos una instancia de $this.

Hasta aquí una explicación breve de lo que son las funciones anónimas y como podemos utilizarlas, pronto empezaremos con los patrones de diseño.

Referencias

0 comentarios:

Publicar un comentario