PHP 5.3和5.4之间的闭包有什么区别?

时间:2013-08-22 22:51:43

标签: php closures mamp

我在本地运行PHP 5.3.15(在OSX上自定义apache / php / mysql堆栈),并且具有以下代码,这很好用:

$my_closure = function($something, $other) use (&$foo, $bar) {
  // watcha doin'? ... stuff.
};

$my_closure('hello', array('one', 'two'));

同事正在使用PHP 5.4.x的MAMP,并且在闭包调用($my_closure(...);)上收到“函数名必须是字符串”错误。

我可以使用call_user_func()call_user_func_array()解决此问题,但我想知道为什么此代码不再适用于5.4.x.我认为这要么是5.4.x的变化,要么是MAMP的问题(根据我的经验,更有可能!)。

在php.net上有一个有点相关的bug report讨论无法使用可调用数组,就像我使用闭包一样。 bug的注释确实证实了我在5.3中的工作正常,并且还提到在5.4中实现可调用的数组功能;或许实现引入了回归错误?任何细节/建议将不胜感激。

是的,我很乐意让Vagrant为团队中的每个人提供相同的环境,但是唉,没有骰子。

2 个答案:

答案 0 :(得分:0)

让你的朋友仔细检查他是否正在运行5.4。你的语法对于5.3和5.4都是完全正确的(我敢说任何未来的PHP版本)

您可以在PHP 5.4 here中测试您的代码(运行echo phpversion();以确认它确实是5.4)。正如您将看到它不会引起任何错误。

答案 1 :(得分:0)

我也尝试了你的代码here,它在PHP5.4中运行良好。

您是否偶然在Mamp配置中使用PHP5.4启用了eAccelerator? eAccelerator缓存软件随Mamp一起提供PHP5.5之前的PHP版本。我建议像另一位开发人员在article中那样禁用eAccelerator。该文章声称,eAccelerator根本没有跟上PHP所经历的所有变化。使用PHP5.4和eAccelerator时,另一个用户也遇到了同样的问题;见here。并且,Mamp不再包含带有PHP的eAcclerator,从PHP5.5版开始。