变量处理机制修改

PHP7版本对变量解析机制做了调整,调整如下:

一、间接变量、属性和方法引用都按照从左到右的顺序进行解释:

  1. $$foo['bar']['baz'] // interpreted as ($$foo)['bar']['baz']
  2. $foo->$bar['baz'] // interpreted as ($foo->$bar)['baz']
  3. $foo->$bar['baz']() // interpreted as ($foo->$bar)['baz']()
  4. Foo::$bar['baz']() // interpreted as (Foo::$bar)['baz']()

如果想改变解释的顺序,可以使用大括号:

  1. ${$foo['bar']['baz']}
  2. $foo->{$bar['baz']}
  3. $foo->{$bar['baz']}()
  4. Foo::{$bar['baz']}()

二、global关键字现在只能引用简单变量

  1. global $$foo->bar; // 这种写法不支持。
  2. global ${$foo->bar}; // 需用大括号来达到效果。

三、用括号把变量或者函数括起来没有用了

  1. function getArray() { return [1, 2, 3]; }
  2. $last = array_pop(getArray());
  3. // Strict Standards: Only variables should be passed by reference
  4. $last = array_pop((getArray()));
  5. // Strict Standards: Only variables should be passed by reference

注意第二句的调用,是用圆括号包了起来,但还是报这个严格错误。之前版本的PHP是不会报这个错误的。

四、引用赋值时自动创建的数组元素或者对象属性顺序和以前不同了。

  1. $array = [];
  2. $array["a"] =& $array["b"];
  3. $array["b"] = 1;
  4. var_dump($array);
  5.  
  6. PHP7产生的数组:["a" => 1, "b" => 1]
  7. PHP5产生的数组:["b" => 1, "a" => 1]