jueves, 22 de mayo de 2014

PHP avanzado: Llamadas recursivas en funciones anónimas (closures)

PHP

Una closure es una función sin nombre que puede por ejemplo asignarse a una variable o pasarse como parámetro a otra función. PHP soporta closures desde la versión 5.3 con una restricción importante: El ámbito de las variables es totalmente privado. Esto quiere decir que desde dentro de la closure no se puede acceder a variables externas a no ser que sean variables globales y las declares con la palabra clave global. Una excepción a esto son las variables superglobales. Además desde PHP 5.4 se puede acceder a $this si la closure se declara dentro de un método de una clase. Esa restricción no es un problema por si mismo, pero restringe el uso de variables locales cuando declaras la closure dentro de una función o de un método de una clase. Para solucionar eso se usa la palabra clave use. Entonces si queremos hacer una llamada recursiva a la closure tendremos que pasar una referencia a la propia closure a través de la palabra clave use. Por ejemplo (*):

$factorial = function( $n ) use ( &$factorial ) {
    if( $n == 1 ) return 1;
    return $factorial( $n - 1 ) * $n;
};

(*) Ejemplo sacado de Stack Overflow.

No hay comentarios:

Publicar un comentario