上手并过渡到PHP7(3)——Uniform Variable Syntax到底统一了什么

PHP7 up and running

泊学原文链接
泊学实操视频

Uniform Variable Syntax

在PHP 7提出Uniform Variable Syntax之前,我们大多数人可能都没有意识到之前版本的PHP语法有多么“不一致”。而事实是在variable-variable和variable-properties的用法上,PHP之前的表现的确有些混乱。

现在好了,PHP 7修复了之前所有的语法一致性问题,并提供了一些新的语法,我们逐一看一下它们。

Consistency Fixes

简单来说,PHP 7采取的Uniform方案就是“统一采用从左到右的方式来评估表达式”。记住这个准则,对于我们分析一些看似复杂的表达式很有帮助。我们通过对比一些代码在PHP 7和PHP 5中的结果,来理解Uniform的含义。为了能够清楚的表示同一语法在不同版本PHP里的评估顺序,我们使用{}做了标记。

<?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还为我们带来了很多新的语法。

调用函数和访问属性

如果函数返回一个包含closure的数组,我们可以这样掉用它:

<?php

foo()[‘bar‘]();

如果数组中的对象有特定的属性,我们可以这样访问它:

<?php

[$obj1, $obj2][3]->prop;

如果函数返回一个字符串,我们可以使用"{字符下标}"来访问字符串中的字符:

<?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};

 

原文:https://segmentfault.com/a/1190000004154524
时间: 2024-10-26 07:10:14

上手并过渡到PHP7(3)——Uniform Variable Syntax到底统一了什么的相关文章

上手并过渡到PHP7(4)——取代fatal error的engine exceptions

上手并过渡到PHP7 取代fatal error的engine exceptions 泊学原文链接泊学代码秀视频 自从PHP 4以来,PHP的错误处理几乎就是一成不变的.只不过在PHP 5.0里添加了E_STRICT,在PHP 5.2里添加了E_RECOVERABLE_ERROR,在PHP 5.3里,添加了E_DPRECATED这几种Error level.尽管PHP 5中加入了Exception,但PHP中只有很少的模块使用了这个机制(例如:pdo和spl).在PHP 7中,这个尴尬的现状,终

上手并过渡到PHP7(1)——基于Homestead的PHP7和XDdebug环境

PHP7 up and running 泊学实操视频泊学原文链接PHP7, Xdebug and Homestead 在经历了13个RC版本之后,PHP 7终于来了.在我们上手评估PHP 7的新特性之前,我们要先建立一个独立的开发环境. Homestead - A full-feature PHP 7 box 安装Homestead vagrant box Homestead是一个由Laravel官方维护的Vagrant "box".它基于Ubuntu 14.04,把一个LNMP环境.

上手并过渡到PHP7(2)——必须传递int, string, bool参数?没问题

Type hints, Type safe 泊学实操视频 泊学原文链接PHP 7中最引人注目的新特性之一,无疑是Scalar type hints.我们可以在函数参数和返回值中使用scalar type hints,还可以指定scalar type的推导和匹配方式. Scalar type hints Type hints并不是什么新生事物,PHP 5.0第一次引入了type hints特性,允许我们指定函数的参数是一个特定class或interface类型.之后,在PHP 5.1中,我们可以指

上手并过渡到PHP7(5)——轻量级“集合”迭代器-Generator

轻量级“集合”迭代器-Generator泊学视频链接泊阅文档链接Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下Generator究竟为我们解决什么问题. 一千万个整数的数组 如果我们要“创建一个指定元素个数的数组”,怎么做呢?我们可能会不加思索的写下下面的代码: function makeRange($range) { $data = []; f

【问底】徐汉彬:PHP7和HHVM的性能之争

摘要:近日,PHP7和HHVM的性能之争成为了一个讨论热点,但毫无疑问,它们都在提升PHP执行性能方面取得了突破性的进展.本期<问底>,徐汉彬将为大家科普和介绍它们的性能之争. [导读]徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升级与重构,目前在小满科技创业,从事SaaS服务技术建设.最近,PHP7和HHVM的性能之争成为了一个讨论热点,它们都在提升PHP执行性能方面取得了突破性的进展.这篇文章,参考了两个社区的技术新进展,为大家科普和介绍它们的性能之争.

【问底】徐汉彬:PHP7和HHVM的性能之争 (真是学到了很多)

来源:http://www.csdn.net/article/2014-12-25/2823234 作者:徐汉彬 摘要:近日,PHP7和HHVM的性能之争成为了一个讨论热点,但毫无疑问,它们都在提升PHP执行性能方面取得了突破性的进展.本期<问底>,徐汉彬将为大家科普和介绍它们的性能之争. [导读]徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升级与重构,目前在小满科技创业,从事SaaS服务技术建设.最近,PHP7和HHVM的性能之争成为了一个讨论热点,它们都

【转发】徐汉彬:PHP7和HHVM的性能之争

问底PHP7HHVM徐汉彬 摘要:近日,PHP7和HHVM的性能之争成为了一个讨论热点,但毫无疑问,它们都在提升PHP执行性能方面取得了突破性的进展.本期<问底>,徐汉彬将为大家科普和介绍它们的性能之争. [导读]徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升级与重构,目前在小满科技创业,从事SaaS服务技术建设.最近,PHP7和HHVM的性能之争成为了一个讨论热点,它们都在提升PHP执行性能方面取得了突破性的进展.这篇文章,参考了两个社区的技术新进展,为大

PHP7革新与性能优化

有幸参与2015年的PHP技术峰会(PHPCON),听了鸟哥(惠新宸)的关于PHP7的新特性和性能优化的分享,一切都令人感到激动.鸟哥是国内最权威的PHP专家,他的分享有很多非常有价值的东西,我通过整理分享的PPT和收集相关资料,整理为这篇解读性质的技术文章,希望能给做PHP开发的同学一些帮助. PHP已经走过了20年的历史,直到今天,PHP7都发布了RC版,据说,PHP7正式版应该会在2015年11月份左右发布.PHP7对于上一个系列的PHP5.*,可以说是一个大规模的革新,尤其是在性能方面实

PHP 鸟哥:我也曾经是“不适合”编程的人

网名:雪候鸟,大家尊称鸟哥,惠新宸 @Laruence, 是国内最有影响力的 PHP 技术专家,PHP 开发组核心成员,PECL 开发者,Zend 公司外聘顾问.他曾供职于雅虎,百度,现在新浪微博任平台及数据部总架构师兼首席 PHP 顾问.惠新宸是 PHP NG 核心开发者,PHP5.4,5.5 的主要开发者.作为 PECL 开发者贡献了 Yaf ,Yar 以及 Yac.Taint 等多个优秀开源作品,同时也是 APC,Opcache,Msgpack 等项目的维护者. 从一个在网上搜 PHP 教