现在使用新的PHP 7.0.0,我有点担心所谓的"变量变量"的评估顺序的变化.
在此页面的 "对变量处理的更改"下,将显示一个表,其中包含表达式示例及其处理顺序,在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 中被解释为一个名为value in的变量的值$foo['bar']['baz']
,因此值为$qux
,即 'quux'
.
但是,在PHP 7中,正如我所理解的那样,同一个表达式将被解释为一个名为value in的变量$foo
,因此我希望PHP注意'数组到字符串转换',因为它$foo
是一个数组.
表中的其他示例似乎是同一主题的变体.
当然,我很好奇为什么在PHP 7中改变了这一点(具体来说,为什么这种改变比向后兼容更重要),然而,这对SO来说不是一个合适的问题.我的问题更实用:
应对这种不兼容性的推荐方法是什么?
当然,加入大括号违规表达式将有助于(${$foo['bar']['baz']}
,$foo->{$bar['baz']}
,$foo->{$bar['baz']}()
和Foo::{$bar['baz']}()
),但是这是非常麻烦的,经历吨的旧代码,寻找相对较少occurances ...
否则,这四个示例是唯一可能的语法变体吗?也就是说,我可以创建一个RegExp和grep
所有违规代码吗?可能存在哪些其他变化?
Rasmus Lerdorf编写了一个静态分析工具,可以发现这些所谓的统一变量语法问题,称为Phan https://github.com/etsy/phan
Phan可以选择-b, --backward-compatibility-checks
检查潜在的PHP 5 - > PHP 7 BC问题.