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

时间:2014-08-06 13:04:20

标签: php

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

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

当我在我的应用程序中执行此代码时,它输出:

NULL string(4) "NULL"

令我惊讶的是,在分配了匿名函数后,$ d怎么能用NULL?

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

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

所以我的PHP应用程序似乎是用Zend Framework构建的。但是我无法理解我的应用程序可以做些什么来搞乱这个核心行为。我在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();

3 个答案:

答案 0 :(得分:2)

好的,所以我忘记提供的信息(或者在调试时基本上错过了)的关键部分是,在我的应用程序中,非工作闭包是脚本执行中的第二个闭包。在我的演示代码中,闭包是脚本中的第一个闭包,因此工作。我的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,当禁用此扩展时,一切都按预期工作。启用此扩展时,callable为NULL。请参阅eAccelerator issue at Github repo

答案 1 :(得分:0)

试试这个

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

    var_dump($d);
    exit;

?>

答案 2 :(得分:0)

可能你有一个旧php。升级吧。

我有下一个结果:

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