【发布时间】:2016-03-09 14:52:13
【问题描述】:
随着新的 PHP 7.0.0 的发布,我有点担心所谓的“变量”的评估顺序的变化。
在this page,在“变量处理的更改”下,显示了一个表格,其中包含表达式示例及其在 PHP 5 和 PHP 7 中的处理顺序。列出的四个表达式是:
$$foo['bar']['baz']
$foo->$bar['baz']
$foo->$bar['baz']()
Foo::$bar['baz']()
给定以下字符串和数组:
$qux = 'quux';
$foo = array('bar' => array('baz' => 'qux'));
$$foo['bar']['baz'] 表中的第一个表达式在 PHP 5 中被解释为一个名为 $foo['bar']['baz'] 中的值的变量的值,因此 $qux 的值是'quux'。
但是,据我了解,在 PHP 7 中,相同的表达式将被解释为一个名为 $foo 中的值的变量,因此我希望 PHP 通知用于“数组到字符串的转换”,因为 @987654330 @ 是一个数组。
表中的其他示例似乎是同一主题的变体。
当然,我很好奇为什么 PHP 7 会改变这一点(具体来说,为什么这种改变比向后兼容更重要),但是,这对于 SO 来说不是一个合适的问题。我的问题更实际:
应对这种不兼容性的推荐方法是什么?
当然,在有问题的表达式中添加花括号会有所帮助(${$foo['bar']['baz']}、$foo->{$bar['baz']}、$foo->{$bar['baz']}() 和 Foo::{$bar['baz']}()),但这非常麻烦,要翻阅大量旧代码,搜索相对较少发生...
否则,这四个示例是唯一可能的语法变化吗?也就是说,我可以创建一个 RegExp 和 grep 所有违规代码吗?可能存在哪些其他变体?
【问题讨论】:
-
真的那么麻烦吗?您只需要找到
$$和->$的所有实例并在需要的地方添加大括号。如果您有多个比$$foo更复杂的实例,那么无论如何您的代码都有问题。将其视为重构的机会。 :) -
P.S.如果您有良好的测试,那么您甚至不需要这样做。看看哪些测试在 5.x 下失败并在 7 下通过。然后修复你的代码。
-
谢谢 Ed Cottrell,你认为
$$、->$和::$是唯一值得一看的吗?我还想念其他哪些人? (我可以处理误报,不会太多)。 -
Phan 应该会为您识别 UVS 问题以及其他各种潜在的迁移问题
-
@MartenKoetsier 应该这样做。请注意,
::$相对于其他人来说会给你很多误报。另外,仅供参考,如果您使用 PHPStorm(或想尝试演示),PHPStorm 10 会自动执行很多 PHP 7 兼容性检查。 (我没有隶属关系;我只是喜欢这个产品。)
标签: php migration incompatibility variable-variables php-7