2010-01-01 9 views
8

He estado leyendo sobre las nuevas características de PHP 5.3, y una de las principales características son cierres.¿Los cierres de PHP están rotos o me falta algo?

A menos que esté muy muy equivocados, los desarrolladores de PHP son cualquiera:
a) confundiendo cierres con sólo funciones anónimas
b) los cierres se rompen en PHP 5.3.1 en la que estoy probando

De what wikipedia says los cierres son el mecanismo de las funciones anónimas más la vinculación de las variables de alcance primarias de la función con el alcance de la función. La última parte parece estar rota en PHP.

He comprobado errores de PHP, y no he encontrado nada sobre esto, curiosamente.

Así es como estoy probando:

<?php 

function getFun() { 
    $x = 2; 
    return function() { 
     return $x; 
    }; 
} 
$f = getFun(); // getFun()(); doesn't work -.- 
var_dump($f()); // $f() == null 

En lenguajes que realmente implementar cierres, devuelve 2:

def f(): 
    x = 2 
    return lambda: x 
print(f()()) # prints 2 

y

alert((function() { 
    var x = 2; 
    return function() { 
     return x; 
    }; 
})()()); // alerts 2 

Así que, ¿estoy equivocado o ?

+0

No tengo el nuevo php para probar :( –

Respuesta

12

Las variables heredadas del alcance externo deben enumerarse explícitamente. del manual:

public function getTotal($tax) 
{ 
    $total = 0.00; 

    $callback = 
     function ($quantity, $product) use ($tax, &$total) 
... 
+0

En otras palabras, un dulce de azúcar – Don

+0

lo llamaría identificación explícita de la variable de cierre, no es un dulce de azúcar –

+2

Gracias, he investigado esto un poco más detalles, y aparentemente el uso es solo copiar variables y no vincularlas al alcance. Así que a menos que use & $ tax (por refferencia), si cambia el impuesto después de la creación de la función anónima, obtendrá el viejo valor de la función creada previamente. PHP simplemente falsifica cierres copiando vars en lugar de vincularlos a los ámbitos. – Prody

3

La implementación de cierres de PHP es ligeramente diferente de lo que cabría esperar si está acostumbrado a usar JavaScript. Simplemente llamando al function() { return x; } no funcionará ya que debe aprovechar la declaración use.

+0

y gracias a Dios por eso –

+0

@Pekka ¿Por qué? –

Cuestiones relacionadas