上手并过渡到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
上手并过渡到PHP7(3)——Uniform Variable Syntax到底统一了什么的更多相关文章
- 上手并过渡到PHP7(4)——取代fatal error的engine exceptions
上手并过渡到PHP7 取代fatal error的engine exceptions 泊学原文链接泊学代码秀视频 自从PHP 4以来,PHP的错误处理几乎就是一成不变的.只不过在PHP 5.0里添加了 ...
- 上手并过渡到PHP7(1)——基于Homestead的PHP7和XDdebug环境
PHP7 up and running 泊学实操视频泊学原文链接PHP7, Xdebug and Homestead 在经历了13个RC版本之后,PHP 7终于来了.在我们上手评估PHP 7的新特性之 ...
- 上手并过渡到PHP7(5)——轻量级“集合”迭代器-Generator
轻量级“集合”迭代器-Generator泊学视频链接泊阅文档链接Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Gener ...
- 上手并过渡到PHP7(2)——必须传递int, string, bool参数?没问题
Type hints, Type safe 泊学实操视频 泊学原文链接PHP 7中最引人注目的新特性之一,无疑是Scalar type hints.我们可以在函数参数和返回值中使用scalar typ ...
- 【问底】徐汉彬:PHP7和HHVM的性能之争 (真是学到了很多)
来源:http://www.csdn.net/article/2014-12-25/2823234 作者:徐汉彬 摘要:近日,PHP7和HHVM的性能之争成为了一个讨论热点,但毫无疑问,它们都在提升P ...
- 【问底】徐汉彬:PHP7和HHVM的性能之争
本文来源于: http://www.csdn.net/article/2014-12-25/2823234 [导读]徐汉彬曾在阿里巴巴和腾讯从事4年多的技术研发工作,负责过日请求量过亿的Web系统升 ...
- PHP7革新与性能优化
有幸参与2015年的PHP技术峰会(PHPCON),听了鸟哥(惠新宸)的关于PHP7的新特性和性能优化的分享,一切都令人感到激动.鸟哥是国内最权威的PHP专家,他的分享有很多非常有价值的东西,我通过整 ...
- PHP7 的部分新特性
1. 运算符(NULL 合并运算符) $a = $_GET['a'] ?? 1; 它相当于: <php$a = isset($_GET['a']) ? $_GET['a'] : 1; 我们知道三 ...
- PHP 鸟哥:我也曾经是“不适合”编程的人
网名:雪候鸟,大家尊称鸟哥,惠新宸 @Laruence, 是国内最有影响力的 PHP 技术专家,PHP 开发组核心成员,PECL 开发者,Zend 公司外聘顾问.他曾供职于雅虎,百度,现在新浪微博任平 ...
随机推荐
- C# 调节图片亮度
原文地址:https://www.cnblogs.com/wjr408/p/6727118.html 昨天去客户那里测试,需求才开始,所以很简单,就是测一下能不能接受到视频或图片,然后保存下来,现场客 ...
- FA_手工明细增加固定资产(流程)
2014-06-08 Created By BaoXinjian
- [android] 网络断开的监听
标签: android 网络监听 杂谈 分类: Android [转自] http://blog.sina.com.cn/s/blog_5d5996d001012o07.html 其实手机在网络方面 ...
- 有关UITableviewCell 重用内存 内部解析
重用实现分析 查看UITableView头文件,会找到NSMutableArray* visiableCells,和NSMutableDictnery* reusableTableCells两个结构 ...
- 算法导论--装备线调度(升序&&降序输出)
题意就先不用讲了吧,感觉自己还没有掌握核心的东西. //心得 //如何保持路径,递归的实现 #include<iostream> #include<cstdio> #inclu ...
- [k8s]kube-router替代kube-proxy实现svc网络和pod网络
本文讲解了kube-router部署,无需在部署kube-proxy了. kube-router采用lvs实现svc网络,采用bgp实现pod网络. kube-router也是基于cni网络,本文是容 ...
- [svc]centos7安装优化最佳姿势
源/软件/时区/selinux/ulimit/vim/sshd 下载安装: https://mirrors.aliyun.com/centos/7.4.1708/isos/x86_64/CentOS- ...
- awstat分析nginx日志
awstat分析nginx日志 http://lxw66.blog.51cto.com/5547576/1323712 server{ listen ; server_name localhost; ...
- HTML5 CSS3 专题 :诱人的实例 3D旋转木马效果相冊
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/32964301 首先说明一下创意的出处:http://www.zhangxinxu ...
- 恶意程序入侵 dbuspm-session 发现了新的方法制这种恶意程序
直接从一台没服务器上把这两文件scp到当前的服务器上并替换这两个程序就ok了!!!!这种方法测试成功!!!! 出现了一个比效麻烦的事,服务器的负载正常,内存也正常,但就是很卡. 通过查找到线索:htt ...