上手并过渡到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};
相关文章
相关标签/搜索