在PHP 7提出Uniform Variable Syntax以前,咱們大多數人可能都沒有意識到以前版本的PHP語法有多麼「不一致」。而事實是在variable-variable和variable-properties的用法上,PHP以前的表現的確有些混亂。express
如今好了,PHP 7修復了以前全部的語法一致性問題,並提供了一些新的語法,咱們逐一看一下它們。數組
簡單來講,PHP 7採起的Uniform方案就是「統一採用從左到右的方式來評估表達式」。記住這個準則,對於咱們分析一些看似複雜的表達式頗有幫助。咱們經過對比一些代碼在PHP 7和PHP 5中的結果,來理解Uniform的含義。爲了可以清楚的表示同一語法在不一樣版本PHP裏的評估順序,咱們使用{}作了標記。php7
<?php $$var['key1']['key2']; // PHP 5.x ${$var['key1']['key2']}; // PHP 7 {$$var}['key1']['key2']; class Demo { public $prop; public __construct() { $this->prop = [ 'key' => 'value' 'closure' => function() { } ]; } } $var = new Demo; $var->prop['key']; // PHP 5.x $var->{prop['key']}; // PHP 7 {$var->prop}['key']; $var->prop['key'](); // PHP 5.x $var->{prop['key']}(); // PHP 7 {$var->prop}['key'](); ClassName::$var['key'](); // PHP 5.x ClassName::{$var['key']}(); // PHP 7 (ClassName::$var)['key']();
除了對已有語法的一致性調整,Uniform Variable Syntax還爲咱們帶來了不少新的語法。函數
調用函數和訪問屬性this
若是函數返回一個包含closure的數組,咱們能夠這樣掉用它:scala
<?php foo()['bar']();
若是數組中的對象有特定的屬性,咱們能夠這樣訪問它:code
<?php [$obj1, $obj2][3]->prop;
若是函數返回一個字符串,咱們可使用"{字符下標}"來訪問字符串中的字符:orm
<?php retString(){1};
除了組合各類表達式以外,咱們還能夠嵌套使用 ::。視頻
若是Foo::bar()返回一個靜態類的名字,咱們能夠這樣訪問它的靜態成員或者調用靜態方法:
<?php
Foo:bar()::$staticProp; Foo:bar()::$staticMethod();
只要表達式返回了一個callable對象,咱們能夠直接調用它們:
<?php foo()(); Foo::bar()(); $foo->bar()();
接下來,咱們來看一些更自由的表達方式:咱們根據表達式expression評估的結果,後面能夠接各類訪問屬性和函數調用的形式:
<?php // (expression) is array (expression)['key']; // (expression) is a class object (expression)->foo(); (expression)->prop; // (expression) is a class name (expression)::$foo; (expression)::foo(); // (expression) is a string (expression){0}; // (expression) is a callable object (expression)();
咱們甚至能夠對一個scalar type進行解引用,若是字符串'ClassName'表明一個類名稱,咱們能夠直接訪問這個類的靜態成員:
<?php 'ClassName'::staticMethod();
咱們還能夠用數組的形式來調用類的靜態方法和成員方法:
<?php ['ClassName', 'staticMethod'](); [$obj, 'method']();
在PHP 7裏,有一個和PHP 5不兼容的語法,會致使解析錯誤。當咱們定義一個global變量的時候,PHP 7不容許使用存在二義性的表達式,例如:
<?php global $$foo->bar; // Wrong in PHP 7
會致使PHP 7解析錯誤,咱們必須使用{}來明肯定義解析順序:
<?php global ${$foo->bar};