La asignación de variable de la función anónima devuelve nulo

Tengo las siguientes líneas de código en mi aplicación:

$d = function(){ return 5; }; var_dump($d, gettype($d)); exit; 

Cuando ejecuto este código en mi aplicación, genera:

 NULL string(4) "NULL" 

Esto me sorprende, ¿cómo puede $ d by NULL después de que se le ha asignado una función anónima?

Cuando ejecuto exactamente el mismo código en un archivo PHP separado en el mismo servidor web bajo el mismo vhost / config, genera:

 object(Closure)#1 (0) {} string(6) "object" 

Así que parece ser algo con mi aplicación PHP que está construida con Zend Framework. Pero no puedo entender lo que mi aplicación podría haber hecho para estropear este comportamiento central. Estoy experimentando este problema con PHP 5.3.2 en CentOS 5.8. Cualquier sugerencia sobre qué está pasando aquí es bienvenida, ya que no tengo ideas sobre esta.

Editar: También cuando se intenta ejecutar $d() en el caso que no funciona PHP dice:

 Fatal error: Function name must be a string in /Bootstrap.php on line 118 

Extraña redacción del error ya que el lenguaje ahora acepta funciones anónimas, pero este código me da el mismo error, por lo que parece ser el mensaje correcto:

 $a = null; $a(); 

Bien, entonces la parte clave de la información que me olvidé de proporcionar (o que esencialmente perdí durante la depuración) es que en mi aplicación el cierre no funcional es el segundo cierre en la ejecución del script. En mi código de demostración, el cierre es el primer cierre en el guión y, por lo tanto, funciona. Parece que hay un problema con mi versión / comstackción de PHP y cierres múltiples. Para el registro, esta es la información de la versión de PHP en la que estoy experimentando este problema:

 PHP Version => 5.3.2 System => Linux ip-172-31-15-243 2.6.18-308.16.1.el5.centos.plusxen #1 SMP Tue Oct 2 23:25:27 EDT 2012 x86_64 Build Date => Jun 6 2013 09:58:54 

El siguiente código proporciona una buena prueba:

 $closures[] = array(); for ($x = 0; $x < 5; $x++) { $closures[$x] = function() use($x) { return $x * 2; }; } var_dump($closures); 

En PHP 5.3.2 roto, esta salida:

 array(5) { [0]=> NULL [1]=> NULL [2]=> NULL [3]=> NULL [4]=> NULL } 

En PHP 5.4.24 en mi MacBook, esta salida:

 array(5) { [0]=> object(Closure)#1 (1) { ["static"]=> array(1) { ["x"]=> int(0) } } [1]=> object(Closure)#2 (1) { ["static"]=> array(1) { ["x"]=> int(1) } } [2]=> object(Closure)#3 (1) { ["static"]=> array(1) { ["x"]=> int(2) } } [3]=> object(Closure)#4 (1) { ["static"]=> array(1) { ["x"]=> int(3) } } [4]=> object(Closure)#5 (1) { ["static"]=> array(1) { ["x"]=> int(4) } } } 

Para hacer las cosas aún más extraño, cuando ejecuto el script en la línea de comando con el comando php, el resultado es correcto. Cuando ejecuto el script a través del comando php-cgi (que es usado por el servidor web) el resultado es incorrecto. Entonces, por ahora, este problema parece tener que ver con php-cgi.

Editar:

La solución: eAccelerator es el problema aquí. Estoy usando eAccelerator v0.9.6, cuando esta extensión está deshabilitada todo funciona como se espera. Cuando esta extensión está habilitada, los llamables son NULL. Vea el problema de eAccelerator en Repo de Github .

Prueba esto

  

Puede ser que tengas un viejo php . Actualízalo por favor.

Tengo el siguiente resultado:

 class Closure#1 (0) { } string(6) "object"