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

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

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

    上手并过渡到PHP7 取代fatal error的engine exceptions 泊学原文链接泊学代码秀视频 自从PHP 4以来,PHP的错误处理几乎就是一成不变的.只不过在PHP 5.0里添加了 ...

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

    PHP7 up and running 泊学实操视频泊学原文链接PHP7, Xdebug and Homestead 在经历了13个RC版本之后,PHP 7终于来了.在我们上手评估PHP 7的新特性之 ...

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

    轻量级“集合”迭代器-Generator泊学视频链接泊阅文档链接Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Gener ...

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

    Type hints, Type safe 泊学实操视频 泊学原文链接PHP 7中最引人注目的新特性之一,无疑是Scalar type hints.我们可以在函数参数和返回值中使用scalar typ ...

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

    来源:http://www.csdn.net/article/2014-12-25/2823234 作者:徐汉彬 摘要:近日,PHP7和HHVM的性能之争成为了一个讨论热点,但毫无疑问,它们都在提升P ...

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

    本文来源于:  http://www.csdn.net/article/2014-12-25/2823234 [导读]徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升 ...

  7. PHP7革新与性能优化

    有幸参与2015年的PHP技术峰会(PHPCON),听了鸟哥(惠新宸)的关于PHP7的新特性和性能优化的分享,一切都令人感到激动.鸟哥是国内最权威的PHP专家,他的分享有很多非常有价值的东西,我通过整 ...

  8. PHP7 的部分新特性

    1. 运算符(NULL 合并运算符) $a = $_GET['a'] ?? 1; 它相当于: <php$a = isset($_GET['a']) ? $_GET['a'] : 1; 我们知道三 ...

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

    网名:雪候鸟,大家尊称鸟哥,惠新宸 @Laruence, 是国内最有影响力的 PHP 技术专家,PHP 开发组核心成员,PECL 开发者,Zend 公司外聘顾问.他曾供职于雅虎,百度,现在新浪微博任平 ...

随机推荐

  1. Python学习笔记015——文件file的常规操作之一(文本文件)

    1 什么是文件 文件是用于数据存储的单位 文件通常用来长期保存数据 读写文件是最常见的I/O操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件的功能都是由操作系统提供的,一般而言,操 ...

  2. RHEL7 - LINUX中的UID

    在RHEL7中: ·UID 0 分配给超级用户 ·UID 1-200是一系列“系统用户”,静态分配给红帽的系统进程 ·UID 201-999是一系列“系统用户”,供文件系统中没有自己的文件的系统进程使 ...

  3. 怎样让VMware上的虚拟机ping通外网(图解教程)

    近期在实习项目中遇到一个问题. 因測试须要,本人在win7上安装VMWare后在启动两台ubuntuserver.两台主机的网络配置所有採用NAT方式实现连接. 之后一路畅通.主机ping通虚拟机和外 ...

  4. yield与send实现协程操作

    yield与send实现协程操作 之前我们说过,在函数内部含有yield语句即称为生成器. 下面,我们来看看在函数内部含有yield语句达到的效果.首先,我们来看看以下代码: def foo(): w ...

  5. Python ceil() 函数

    描述 ceil(x) 函数返回一个大于或等于 x 的的最小整数(向上取整). 语法 以下是 ceil() 方法的语法: import math math.ceil( x ) 注意:ceil()是不能直 ...

  6. 使用python执行linux命令

    python版本是2.7.12 一.简单的获取linux命令的执行结果,比如:获取一个PID的进程树结构,linux命令是pstree -p pid,在python中有一个模块可以方便的获取.至于有时 ...

  7. 枚举操作的常用方法,包括获得枚举的value,name,description

    public enum SendInfoStateEnum    {   [Description("等待提交")]        等待提交 = 1, [Description(& ...

  8. angular学习笔记(一)-入门案例

    入门实例: 一个购物车产品清单,可以自行改变数量,总价自动计算的小例子: 代码如下: <!DOCTYPE html> <html ng-app> <head> &l ...

  9. 如何在Windows环境搭建Object C开发环境

    1. 安装编译环境 Object C和其他很多语言一样,都需要有一个编译器.Object C 是在GCC下编译的.GCC(GNU Compiler Collection,GNU编译器集合),是一套由 ...

  10. java 多线程10:synchronized锁机制 之 锁定类静态方法 和锁定类.Class 和 数据String的常量池特性

    同步静态方法 synchronized还可以应用在静态方法上,如果这么写,则代表的是对当前.java文件对应的Class类加锁.看一下例子,注意一下printC()并不是一个静态方法: public ...