上手並過渡到PHP7(3)——Uniform Variable Syntax到底統一了什麼

PHP7 up and running

泊學原文連接
泊學實操視頻php

Uniform Variable Syntax

在PHP 7提出Uniform Variable Syntax以前,咱們大多數人可能都沒有意識到以前版本的PHP語法有多麼「不一致」。而事實是在variable-variable和variable-properties的用法上,PHP以前的表現的確有些混亂。express

如今好了,PHP 7修復了以前全部的語法一致性問題,並提供了一些新的語法,咱們逐一看一下它們。數組

Consistency Fixes

簡單來講,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']();

PHP 7中的新語法

除了對已有語法的一致性調整,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']();

A parse error in PHP 7

在PHP 7裏,有一個和PHP 5不兼容的語法,會致使解析錯誤。當咱們定義一個global變量的時候,PHP 7不容許使用存在二義性的表達式,例如:

<?php

global $$foo->bar; // Wrong in PHP 7

會致使PHP 7解析錯誤,咱們必須使用{}來明肯定義解析順序:

<?php

global ${$foo->bar};
相關文章
相關標籤/搜索