PHP 5.3和5.4之间的闭包有什么不同?

4

我正在本地运行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上有一个相关的错误报告,讨论了无法像我使用闭包那样使用可调用数组的问题。该错误报告的评论确实确认了我在5.3中所做的工作很好,并提到在5.4中实现可调用数组功能;也许实现引入了回归错误?任何详细信息/建议将不胜感激。
是的,我很想为团队中的每个人使用Vagrant,以便拥有相同的环境,但很遗憾,这是不可能的。

http://php.net/manual/en/migration54.php - user2417483
2
谢谢Jeff,但如果更新日志中有任何有用的信息,我就不会发这个问题了。 - Yuriy Babenko
1
让你的朋友确认他正在运行5.4版本。你的语法对于5.3和5.4都完全没有问题(我敢说对于任何将来的PHP版本也是如此)。 - Mchl
可能你在某个地方覆盖了$my_closure。这不是完整的代码,对吧? - meze
那就是代码的全部范围,没错。我们确实双重检查了PHP版本 - 那是我们环境之间唯一的区别。无论如何,这是很久以前的事情,现在已经不再是一个相关的问题了(那个开发人员已经转移到了另一个项目),所以我现在无法测试解决方案。 - Yuriy Babenko
2个回答

0

我也尝试了你的代码这里,在PHP5.4中可以正常工作。

你是否碰巧在Mamp配置中启用了PHP5.4的eAccelerator?eAccelerator缓存软件随Mamp一起提供,适用于PHP5.5之前的版本。我建议像另一个开发人员在文章中所做的那样禁用eAccelerator。该文章声称eAccelerator没有跟上PHP经历的所有变化。另一个用户在使用PHP5.4和eAccelerator时也遇到了同样的问题;请参见这里。而且,从PHP5.5开始,Mamp不再将eAcclerator与PHP捆绑在一起。


我之前遇到过这个问题,但现在无法再重现了。我不确定我的同事的机器上是否使用了 eAccelerator。 - Yuriy Babenko

0

让你的朋友确认他正在运行5.4版本。你的语法在5.3和5.4版本中都完全正常(我敢说未来的PHP版本也是如此)

你可以在PHP 5.4 这里 测试你的代码(运行 echo phpversion(); 确认确实是5.4)。如你所见,它不会引发任何错误。


1
他是。否则,他会在 function() use() 行上获得致命错误。 - meze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接