1. 运算符(NULL 合并运算符)

$a = $_GET['a'] ?? 1;

它相当于:

<php
$a = isset($_GET['a']) ? $_GET['a'] : 1;

我们知道三元运算符是可以这样用的:

$a ?: 1

但是这是建立在 $a 已经定义了的前提上。新增的 ?? 运算符可以简化判断。

2、List 的方括号简写

PHP5.4 之前只能通过 array() 来定义数组,5.4之后添加了 [] 的简化写法。

<?php // 5.4 之前

$array = array(1, 2, 3);

$array = array("a" => 1, "b" => 2, "c" => 3);

// 5.4 及之后

$array = [1, 2, 3];

$array = ["a" => 1, "b" => 2, "c" => 3];

那么,如果要把数组的值赋值给不同的变量,可以通过 list 来实现:

  <?php list($a, $b, $c) = $array;

是否也可以通过 [] 的简写来实现呢?

  <?php [$a, $b, $c] = $array;

以及下一个特性中会提到的 list 指定 key:

<?php ["a" => $a, "b" => $b, "c" => $c] = $array;

PHP7.1 实现了这个特性,但:出现在左侧的 [] 并不是数组的简写,而是 list() 的简写。

现在新的 list() 的实现并不仅仅可以出现在左值中,也能在 foreach 循环中使用:

  <?php foreach ($points as ["x" => $x, "y" => $y]) {

  var_dump($x, $y);

  }

不过因为实现的问题,list() 和 [] 不能相互嵌套使用:

  <?php // 不合法

  list([$a, $b], [$c, $d]) = [[1, 2], [3, 4]];

  // 不合法

  [list($a, $b), list($c, $d)] = [[1, 2], [3, 4]];

  // 合法

  [[$a, $b], [$c, $d]] = [[1, 2], [3, 4]];

另外,在新的 list() 的实现中可以指定key:

  <?php $array = ["a" => 1, "b" => 2, "c" => 3];

  ["a" => $a, "b" => $b, "c" => $c] = $array;

相当于:

  <?php $a = $array['a'];

  $b = $array['b'];

  $c = $array['c'];

和以往的区别在于以往的 list() 的实现相当于 key 只能是 0, 1, 2, 3 的数字形式并且不能调整顺序。执行语句:

  <?php list($a, $b) = [1 => '1', 2 => '2'];

会得到 PHP error: Undefined offset: 0... 的错误。

新的实现则可以通过以下方式来调整赋值:

  <?php list(1 => $a, 2 => $b) = [1 => '1', 2 => '2'];

不同于数组的是,list 并不支持混合形式的 key,以下写法会触发解析错误:

<?php // Parse error: syntax error, ...

list($unkeyed, "key" => $keyed) = $array;

更复杂的情况,list 也支持复合形式的解析:

<?php $points = [

["x" => 1, "y" => 2],

["x" => 2, "y" => 1]

];

list(list("x" => $x1, "y" => $y1), list("x" => $x2, "y" => $y2)) = $points;

$points = [

"first" => [1, 2],

"second" => [2, 1]

];

list("first" => list($x1, $y1), "second" => list($x2, $y2)) = $points;

以及循环中使用:

<?php $points = [

["x" => 1, "y" => 2],

["x" => 2, "y" => 1]

];

foreach ($points as list("x" => $x, "y" => $y)) {

echo "Point at ($x, $y)", PHP_EOL;

}

3. 标量类型和返回类型声明(Scalar Type Declarations & Scalar Type Declarations)

PHP语言一个非常重要的特点就是“弱类型”,它让PHP的程序变得非常容易编写,新手接触PHP能够快速上手。PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 callable (PHP 5.4,即可以是函数,包括匿名函数),现在也可以使用 string、int、float和 bool 了。支持变量类型的定义,可以说是革新性质的变化,PHP开始以可选的方式支持类型定义。除此之外,还引入了一个开关指令declare(strict_type=1);,当这个指令一旦开启,将会强制当前文件下的程序遵循严格的函数传参类型和返回类型。

例如一个add函数加上类型定义,可以写成这样:

如果配合强制类型开关指令,则可以变为这样:

如果不开启strict_type,PHP将会尝试帮你转换成要求的类型,而开启之后,会改变PHP就不再做类型转换,类型不匹配就会抛出错误。对于喜欢“强类型”语言的同学来说,这是一大福音。

需要注意的是严格模式的问题在这里同样适用:强制模式(默认,既强制类型转换)下还是会对不符合预期的参数进行强制类型转换,严格模式下则触发 TypeError 的致命错误。

4、 更多的Error变为可捕获的Exception

PHP7实现了一个全局的throwable接口,原来的Exception和部分Error都实现了这个接口(interface), 以接口的方式定义了异常的继承结构。于是,PHP7中更多的Error变为可捕获的Exception返回给开发者,如果不进行捕获则为Error,如果捕获就变为一个可在程序内处理的Exception。这些可被捕获的Error通常都是不会对程序造成致命伤害的Error,例如函数不存。PHP7进一步方便开发者处理,让开发者对程序的掌控能力更强。因为在默认情况下,Error会直接导致程序中断,而PHP7则提供捕获并且处理的能力,让程序继续执行下去,为程序员提供更灵活的选择。

例如,执行一个我们不确定是否存在的函数,PHP5兼容的做法是在函数被调用之前追加的判断function_exist,而PHP7则支持捕获Exception的处理方式。

5、AST(Abstract Syntax Tree,抽象语法树)

    AST在PHP编译过程作为一个中间件的角色,替换原来直接从解释器吐出opcode的方式,让解释器(parser)和编译器(compliler)解耦,可以减少一些Hack代码,同时,让实现更容易理解和可维护。

  PHP 5:

  

  PHP 7:

  

  更多AST信息:https://wiki.php.net/rfc/abstract_syntax_tree

6、其他新特性

PHP 7新特性和变化不少,我们这里并不全部展开来细说哈。

  1. Int64支持,统一不同平台下的整型长度,字符串和文件上传都支持大于2GB。
  2. 统一变量语法(Uniform variable syntax)。
  3. foreach表现行为一致(Consistently foreach behaviors)
  4. 新的操作符 <=>, ??
  5. Unicode字符格式支持(\u{xxxxx})
  6. 匿名类支持(Anonymous Class)

 

PHP7 的部分新特性的更多相关文章

  1. php5.3到php7.0.x新特性介绍

    <?php /*php5.3*/ echo '<hr>'; const MYTT = 'aaa'; #print_r(get_defined_constants()); /* 5.4 ...

  2. PHP7.0-PHP7.3新特性与变更

    到目前为止,PHP7发布已经升级到7.3,本文来总结一下每个版本的变更与新特性 PHP7.0 1. 组合比较符 (<=>) 组合比较符号用于比较两个表达式.当$a小于.等于或大于$b时它分 ...

  3. PHP7的五大新特性

    如果你使用的是基于 composer 和 PSR-4 的框架,这种写法是否能成功的加载类文件?其实是可以的,composer 注册的自动加载方法是在类被调用的时候根据类的命名空间去查找位置,这种写法对 ...

  4. Php7有哪些新特性:

    PHP7在PHP5的基础上又做了一次质的提升,当然改变很多,我这里以我的总结简单说下,主要发生了下面这些更改: 移除了一些旧的特性 ZEND引擎升级到Zend Engine 3,也就是所谓的PHP N ...

  5. PHP7中我们应该学习会用的新特性

    PHP7于2015年11月正式发布,本次更新可谓是PHP的重要里程碑,它将带来显著的性能改进和新特性,并对之前版本的一些特性进行改进.本文小编将和大家一起来了解探讨PHP7中的新特性. 1. 标量类型 ...

  6. php7 新特性整理

    PHP7 已经出来1年了,PHP7.1也即将和大家见面,这么多好的特性,好的方法,为什么不使用呢,也希望PHP越来越好. 在这里整理 PHP 5.1 ,PHP5.2,PHP5.3,PHP5.4,PHP ...

  7. php7+新特性

    php7已经发布有段时间了,查了下正式版本的发布时间是2015年底,至于具体的新特性,在这里总结一下. 标量类型声明 php7新增了4种类型, 字符串(string), 整数 (int), 浮点数 ( ...

  8. [PHP7.0-PHP7.2]的新特性和新变更

    php7发布已经升级到7.2.里面发生了很多的变化.本文整理php7.0至php7.2的新特性和一些变化. 参考资料: http://php.net/manual/zh/migration70.new ...

  9. PHP7 新特性 简介

    整理了一些常用的新特性,欢迎点赞!!! 新增操作符 1.?? $username = $_GET['user'] ?? ''; $username = isset($_GET['user']) ? $ ...

随机推荐

  1. 解决'androidx.arch.core:core-runtime' has different version for the compile (2.0.0) and runtime (2.0.1)

    先说原因,我们引用的包版本不同产生了冲突,所以编译不通过.解决的办法是在引用的时候排除一个版本,只留一个版本. 解决过程: 先找出哪些库引用了相同的库,仅仅是版本不同. gradle app:depe ...

  2. ffmpeg处理视频命令

    一:视频添加图片水印 ffmpeg -i a.mp4 -vf "movie=a.jpg[watermark];[in][watermark] overlay=main_w-overlay_w ...

  3. sql 存储过程笔记2

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sys_Page_v2]') and OBJECTPROPE ...

  4. php--常见算法2

    <?php function zhi($number){ $f1=1; $f2=1; for($i=3;$i<=$number;$i++){ //前一个的前一个值+前一个值 $f3=$f1 ...

  5. Java学习笔记【六、正则表达式】

    参考:http://www.runoob.com/java/java-regular-expressions.html 概述 java.util.regex包,主要包含三个类: Pattern:正则表 ...

  6. 第九章、import 和from ...import

    目录 第九章.import 和from ...import 一.import和 from ...import ... 二.import模块名 第九章.import 和from ...import 一. ...

  7. idea中无法自动提示相关jar包

    遇到的问题:今天在pom.xml导入数据库坐标后,发现在在配置数据相关属性时,idea无法使用我引入的jar包,后面才发现是因为在下载包时,没网络了,jar包下载失败 解决办法:cmd进入自己的mav ...

  8. centos 7 安装 Docker Engine-CentOS 社区版

    获取Docker Engine-CentOS社区: https://docs.docker.com/install/linux/docker-ce/centos/ 1.操作系统要求 1.1 要安装 D ...

  9. IoT 设备通信安全讨论

    IoT 设备通信安全讨论 作者:360CERT 0x00 序言 IoT 设备日益增多的今天,以及智能家居这一话题愈发火热,智能家居市场正在飞速的壮大和发展,无数 IoT 设备正在从影片中不断的走向用户 ...

  10. NORDIC 出现NRF_ERROR_NO_MEM错误

    Which SDK version are you using, is it SDK v12.x.x? Which function returns NRF_ERROR_NO_MEM? Is it s ...