随着新的 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 中被解释为一个名为 in 的变量的值$foo['bar']['baz']
,因此是 的值$qux
,即 'quux'
。
但是,据我了解,在 PHP 7 中,相同的表达式将被解释为名为 in 的值的变量$foo
,因此我希望 PHP 通知用于“数组到字符串转换”,因为$foo
它是一个数组。
表中的其他示例似乎是同一主题的变体。
当然我很好奇为什么在 PHP 7 中改变了这一点(具体来说,为什么这个改变比向后兼容更重要),但是,这对于 SO 来说不是一个合适的问题。我的问题更实际:
应对这种不兼容性的推荐方法是什么?
当然,在有问题的表达式中添加花括号会有所帮助(${$foo['bar']['baz']}
、、$foo->{$bar['baz']}
和) $foo->{$bar['baz']}()
,Foo::{$bar['baz']}()
但这非常麻烦,要遍历大量旧代码,搜索相对较少的出现...
否则,这四个示例是唯一可能的语法变化吗?也就是说,我可以创建一个正则表达式和grep
所有有问题的代码吗?可能存在哪些其他变体?