PHP7 up and running——Uniform Variable Syntax

   2016-08-30 0
核心提示:PHP7 up and running泊学原文链接泊学实操视频Uniform Variable Syntax在PHP 7提出Uniform Variable Syntax之前,我们大多数人可能都没有意识到之前版本的PHP语法有多么“不一致”。而事实是在variable-variable和variable-properties的用法上,PHP之前的表现

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};
 
标签: PHP7
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • php7.2.4安装rabbitmq扩展的过程中错误处理
    1、根据自己php的版本选择 amqp包的版本,我开始随便选择了amqp-1.6.1.tar.gz make之后出现如下错误:/opt/amqp-1.6.1/amqp.c:984:37: error: too many arguments to function ‘zend_register_internal_class_ex’amqp_queue_exception_class_entry
    02-09
  • tp5+php7 实现发送邮件(qq邮箱和企业邮箱均验证)
    tp5+php7 实现发送邮件(qq邮箱和企业邮箱均验
    一:   准备工作              1:phpmailer核心文件下载地址:https://github.com/PHPMailer/PHPMailer               2、PHP扩展开启,openssl和sockets,打开php.ini文件,将这两个扩展钱的;号去掉。                    ①  
    02-09
  • 第二章:php7扩展开发[2] 怎么样创建类
    1.创建扩展进入${php-src}/ext目录,执行./ext_skel--extname=route,这时目录下会出现一个route的目录,cd ./route2.修改config.m4内容第十行左右,去掉dnlPHP_ARG_WITH(route, for route support,dnl Make sure that the comment is aligned:[ --with-route
    02-09
  • PHP之Trait详解 php7 trait
    PHP之Trait详解 php7 trait
    php从以前到现在一直都是单继承的语言,无法同时从两个基类中继承属性和方法,为了解决这个问题,php出了Trait这个特性用法:通过在类中使用use 关键字,声明要组合的Trait名称,具体的Trait的声明使用Trait关键词,Trait不能实例化 与普通类的异同:相同:t
    02-09
  • ubuntu14.04 安装apache+php7.2*
    1.安装apache2   sudo apt-get update  sudo apt-get install apache2  这时http://你机器的ip,就可以访问了   2.安装php7.0+及一些必要的扩展   apt-get install software-properties-common python-software-properties add-apt-repository p
    02-09
  • PHP7新功能及语法变化总结 PHP新特性
    1、标量类型声明有两种模式: 强制 (默认) 和 严格模式。 现在可以使用下列类型参数(无论用强制模式还是严格模式): 字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool)。2、返回值类型声明返回类型声明指明了函数返回值的类型。可用的类型与参
    02-09
  • php7修改时区无效如何解决
    这篇文章主要介绍“php7修改时区无效如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php7修改时区无效如何解决”文章能帮助大家解决问题。php7修改时区无效的解决办法:1、从代码中动态修改时区,从而获
    02-08 php
  • PHP7框架之Lumen之Hello World。
    背景:听说Lumen起家是以一个叫av的框架,larvael。以Auth2.0起步,Lumen是精简版本,于是想了解一下。发现居然边TM路由就卡住了,Fuck,不光是我老外也有这个问题,都没有解决,主要是一个Nginx的转写问题,这块在Lumen的文档里写的很垃圾,我都不知这些人是
    02-05 PHP7
  • 亿级用户PC主站的PHP7升级实践
    亿级用户PC主站的PHP7升级实践
    伴随业务的增长,系统压力也在不断增加,再加上机房机架趋于饱和,无法更加有效应对各种突发事件。在这样的情况下,PC主站升级为PHP 7,有哪些技术细节可以分享?背景新浪微博在2016年Q2季度公布月活跃用户(MAU)较上年同期增长33%,至2.82亿;日活跃用户(D
    02-05 PHP7
  • PHP7 内核分析:变量的设计
    变量的结构变量的数据结构变量保存在zval的结构体中(与 PHP5 相同,但数据结构做了很大改变)。zval结构体定义在Zend/zend_types.h文件中,结构体如下:typedef struct _zval_struct zval;struct _zval_struct {zend_valuevalue;/* value */union {struct {Z
    02-05 PHP7
点击排行