Php 匿名函数的变量赋值返回null

Php 匿名函数的变量赋值返回null,php,Php,我的应用程序中有以下代码行: $d = function(){ return 5; }; var_dump($d, gettype($d)); exit; 当我在应用程序中执行此代码时,它会输出: NULL string(4) "NULL" object(Closure)#1 (0) {} string(6) "object" 这让我感到惊讶,在分配了匿名函数之后,$d怎么能被NULL替换呢 当我在同一Web服务器上的一个单独PHP文件中以相同的vhost/config输出完全相同

我的应用程序中有以下代码行:

$d = function(){
    return 5;
};
var_dump($d, gettype($d));
exit;
当我在应用程序中执行此代码时,它会输出:

NULL string(4) "NULL"
object(Closure)#1 (0) {} string(6) "object"
这让我感到惊讶,在分配了匿名函数之后,$d怎么能被NULL替换呢

当我在同一Web服务器上的一个单独PHP文件中以相同的vhost/config输出完全相同的代码时:

NULL string(4) "NULL"
object(Closure)#1 (0) {} string(6) "object"
因此,我的PHP应用程序似乎是用Zend框架构建的。但我不明白我的应用程序会做些什么来破坏这个核心行为。我在CentOS 5.8上使用PHP5.3.2时遇到了这个问题。任何关于这里发生的事情的指示都是受欢迎的,因为我对这件事已经没有想法了

编辑:当尝试在非工作状态下运行
$d()
时,PHP会说:

Fatal error: Function name must be a string in /Bootstrap.php on line 118
由于该语言现在接受匿名函数,因此错误的措辞很奇怪,但此代码给出了相同的错误,因此它似乎是正确的消息:

$a = null;
$a();
试试这个

<?php 
    function abc (){
        return 5;
    };
    $d =abc(); 

    var_dump($d);
    exit;

?>

好的,我忘记提供(或者在调试时基本上遗漏了)的关键信息是,在我的应用程序中,非工作闭包是脚本执行过程中的第二个闭包。在我的演示代码中,闭包是脚本中的第一个闭包,因此可以正常工作。我的PHP版本/构建和多个闭包似乎有问题。记录如下:这是我遇到此问题的PHP版本信息:

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
以下代码提供了一个良好的测试:

$closures[] = array();
for ($x = 0; $x < 5; $x++) {
    $closures[$x] = function() use($x) {
        return $x * 2;
    };
}
var_dump($closures);
在我的MacBook上的PHP 5.4.24上,此输出:

array(5) {
  [0]=>
  NULL
  [1]=>
  NULL
  [2]=>
  NULL
  [3]=>
  NULL
  [4]=>
  NULL
}
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)
    }
  }
}
更奇怪的是,当我使用php命令在命令行上运行脚本时,输出是正确的。当我通过PHPCGI命令(Web服务器使用)运行脚本时,输出是错误的。所以现在这个问题似乎与php cgi有关

编辑:


解决方案:这里的问题是每个加速器。我使用的是eAccelerator v0.9.6,当这个扩展被禁用时,一切正常。启用此扩展时,可调用的值为空。请参阅。

您可能有一个旧的
php
。请升级

我有下一个结果:

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

您确定在两个vhost上都运行php5.3吗?是的,只有一个vhost。它工作的文件就在不工作的文件旁边。哦,我看我读错了,我的错,我没有办法再编辑代码了,但是我不想运行这个函数,我想要一个可调用的,可以在以后运行。最终我要做的是实现这一点:。代码似乎确实有问题。似乎只有在代码中定义的第一个closuure起作用。我忘了提到的是,代码前面有一个工作闭包。当我在dome代码中放入两个闭包时,第二个闭包也不起作用。另外,问题只在使用php cgi时发生,而不是在使用php二进制文件本身时发生。我建议您将实际解决方案(eAccelerator)移到顶部。