Skip to content

PHP变量处理机制修改 #17

@suhao

Description

@suhao

PHP7版本对变量解析机制做了调整,前面提到变量作用域时简单提过。下面我们来详细看一看。

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

$$foo['bar']['baz'] // interpreted as ($$foo)['bar']['baz']
 $foo->$bar['baz']   // interpreted as ($foo->$bar)['baz']
 $foo->$bar['baz']() // interpreted as ($foo->$bar)['baz']()
 Foo::$bar['baz']()  // interpreted as (Foo::$bar)['baz']()

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

${$foo['bar']['baz']}
$foo->{$bar['baz']}
$foo->{$bar['baz']}()
Foo::{$bar['baz']}()

global关键字只能引用简单变量

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

用括号将变量或函数括起来失效了

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

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

$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);

PHP7产生的数组:["a" => 1, "b" => 1]
PHP5产生的数组:["b" => 1, "a" => 1]

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions