我的应用程序中有以下代码行:
$d = function(){
return 5;
};
var_dump($d, gettype($d));
exit;
当我在应用程序中执行此代码时,它输出:
NULL string(4) "NULL"
这让我感到惊讶,$d在被分配一个匿名函数后怎么能被NULL呢?
当我在同一个web服务器上的同一个vhost/config下的单独PHP文件中运行完全相同的代码时,它输出:
object(Closure)#1 (0) {} string(6) "object"
所以它似乎是我的PHP应用程序是用Zend框架构建的。但我不明白我的应用程序怎么搞砸了这个核心行为。我在CentOS 5.8上使用PHP 5.3.2遇到这个问题。任何关于这里正在发生的事情的指导都是欢迎的,因为我对这个都没有想法了。
编辑:当试图在非工作情况下运行$d()
时,PHP说:
Fatal error: Function name must be a string in /Bootstrap.php on line 118
错误的奇怪措辞,因为语言现在接受匿名函数,但这段代码给了我同样的错误,所以它似乎是正确的消息:
$a = null;
$a();
好的,那么我忘记提供(或者在调试时基本上遗漏了)的信息的关键部分是,在我的应用程序中,不工作的闭包是脚本执行中的第二个闭包。在我的演示代码中,闭包是脚本中的第一个闭包,因此可以工作。似乎有一个问题与我的版本/构建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);
在不完整的PHP 5.3.2上输出:
array(5) {
[0]=>
NULL
[1]=>
NULL
[2]=>
NULL
[3]=>
NULL
[4]=>
NULL
}
在我的MacBook上的PHP 5.4.24上输出:
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命令运行脚本时,输出是正确的。当我通过php-cgi命令(由web服务器使用)运行脚本时,输出是错误的。所以现在这个问题似乎与php-cgi有关。
编辑:解决方案: eAccelerator是这里的问题。我使用的是eAccelerator v0.9.6,当这个扩展被禁用时,一切都按预期工作。当启用此扩展时,可调用对象为NULL。
试试这个
<?php
function abc (){
return 5;
};
$d =abc();
var_dump($d);
exit;
?>
可能你有一个旧的php
。请升级。
我有下一个结果:
class Closure#1 (0) {
}
string(6) "object"