php - 变量变量处理顺序: changes in PHP 7

标签 php migration incompatibility variable-variables php-7

随着新的 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/

相关文章:

php - 这个sql代码会正确更新吗?

mysql - Capistrano 部署到数据库

javascript - 使用 postgreSQL 和 express JS 续写 nodejs 中的迁移错误

java - Java 迭代器返回的结果的泛型类型不兼容

scala - 使用仅适用于较旧 Scala 版本的 Scala 库

javascript - 在 Joomla 中加载 JavaScript 函数 onload 事件

Php 跳过第一个 MySQL 行。不是常见的 double fetch() 错误

php - 从数组 : for loop not working 返回字母

ruby-on-rails - 在 Rails 中一次迁移中的多个表 - 如何命名

java - 如何修复java.lang.UnsupportedClassVersionError:不支持的major.minor版本