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. 解决LLDB模式下出现message sent to deallocated instance错误

    本文在源文的基础上做整理:http://www.devdiv.com/home.php?mod=space&uid=50901&do=blog&id=50856 Xcode版本 ...

  2. Python学习笔记012——装饰器

    1 装饰器 1.1装饰器定义 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator). 1.2 装饰器分类 装饰器:函数装饰器,类装饰器,函数的装饰器,类的装饰器 装饰器:函数装饰函 ...

  3. Android 下拉菜单 Spinner 赋值

    private Spinner m_spiModel = null; //产品型号 m_spiModel = (Spinner) findViewById(R.id.spiModel);//产品型号 ...

  4. VS报:"dll标记为系统必备组件,必须对其进行强签名"错误

    问题: VS生成程序时,报“要将程序集“XX.dll”标记为系统必备组件,必须对其进行强签名.”错误. 解决方法: 1)在报错的解决方案中找到一个可以发布的项目(引用该XX.dll的项目未必可以发布) ...

  5. LevelDB场景分析1--整体结构分析

    基本用法 数据结构 class DBImpl : public DB { private:     struct CompactionState;     struct Writer;// Infor ...

  6. shell学习四十八天----文件校验和匹配

    文件校验和匹配 要是你怀疑可能有非常多文件具有同样的内文,而是用cmp或diff进行比較全部横队的比較,导致所花费的时间会随着文件数目增长成次方的增长. 这是能够使用file checksum(文件校 ...

  7. Python UNICODE GBK UTF-8 之间相互转换

    Python 编码格式检测,可以使用 chardet , 例如: import urllib rawdata = urllib.urlopen('http://www.google.cn/').rea ...

  8. spineRunTime for cocos2dx v3 中动画播完删除animation

    spineRunTime for cocos2dx v3 中删除animation,发现下面写法会崩溃:   spine::SkeletonAnimation* animationNode = spi ...

  9. JavaScript:表单常用验证脚本(整理)

    以下内容根据网上资源整理而来,主要来源是CSDN一个供下载的check.js,源码地址找不到了. 1. 检查输入字符串是否为空或者全部都是空格 /* 检查输入字符串是否为空或者全部都是空格 输入:st ...

  10. html input select等控件宽度对不齐?请使用box-sizing。

    今天终于明白为什么表单元素的宽度经常对不齐了,原来是计算的问题. 为元素设置:box-sizing: border-box;,则表明width的宽度为内容本身宽度+padding+border(高度一 ...