随着新的 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 通知“数组到字符串” conversion',因为 $foo
是一个数组。
表中的其他示例似乎是同一主题的变体。
当然,我很好奇为什么 PHP 7 中会发生这种变化(具体来说,为什么这种变化比向后兼容更重要),但是,这不是一个适合 SO 的问题。我的问题比较实际:
解决这种不兼容性的推荐方法是什么?
当然,在有问题的表达式中添加花括号会有所帮助 (${$foo['bar']['baz']}
, $foo->{$bar[ 'baz']}
、$foo->{$bar['baz']}()
和 Foo::{$bar['baz']}()
),但这非常麻烦,要遍历大量旧代码,搜索相对较少的出现...
否则,这四个示例是唯一可能的语法变化吗?也就是说,我可以创建 RegExp 并 grep
所有违规代码吗?还可能存在哪些其他变体?
最佳答案
Rasmus Lerdorf 编写了一个静态分析工具,可以发现这些所谓的统一变量语法问题,称为 Phan https://github.com/etsy/phan
Phan 具有选项 -b, --backward-compatibility-checks
来检查潜在的 PHP 5 -> PHP 7 BC 问题。
关于php - 变量变量处理顺序: changes in PHP 7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34092299/