太空船操作符 <=>

用于比较两个表达式,例如:当$a小于,等于或大于$b时分别返回-1,0或1

 1. echo 1 <=> 1 // 0
 2. echo 1 <=> 2 // -1
 3. echo 2 <=> 1 // 1

类型申明

标量类型声明 有两种模式: 强制 (默认) 和 严格模式。 现在可以使用下列类型参数(无论用强制模式还是严格模式): 字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool)。它们扩充了PHP5中引入的其他类型:类名,接口,数组和 回调类型。

  1. 强制模式:强制是默认的模式,不需要指定。
  2. 严格模式:严格的模式必须明确暗示。RFC 给每一个 PHP 文件,添加一句新的可选指令declare(strict_type=1);,让同一个 PHP 文件内的全部函数调用和语句返回,都有一个“严格约束”的标量类型声明检查。
declare(strict_types=1); // strict_types=1表示开启严格模式
function demo (int $a, int $b):int
{
   return $a + $b;
}

null合并操作符 ??

由于在 PHP7 项目中存在大量同时使用三元表达式和 isset() 的情况,因此新增的空合并运算符可以用来取代三元运算与 isset() 函数,如果变量是存在的并且不为 null ,则空合并运算符将返回它的第一个操作数;否则将返回其第二个操作数。

$a = isset($_GET[‘id']) ? $_GET[id] : 0;
//等同于新版中的:
$a = $_GET[id] ?? 0;
// **注意$_GET[id]的值为空字符串的时候取到的值是空字符串而不是0**

常量数组

在 PHP7 中,如果您需要定义 Array 类型的常量,那么通过使用 define()函数进行定义是一个不错的选择。使用过 PHP 5.6 版本的朋友应该知道,在 PHP5.6 中,只能使用 const 关键字来定义数组类型的常量

//php 5
CONST FRUITS = ['apple', 'orange', 'banana'];
//php 7
CONST FRUITS = ['apple', 'orange', 'banana'];
define('FRUITS', ['apple', 'orange', 'banana'])

实际测试中php5 define('FRUITS', ['apple', 'orange', 'banana'])也能生效,但是会报错Constants may only evaluate to scalar values,这个意思就是Define only works to define constants

批量导入命名空间

同一 namespace 导入的类、函数和常量现在可以通过单个 use 语句 一次性导入了。

// PHP 7 之前的代码
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;

use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;

use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;

// PHP 7+ 及更高版本的代码
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};

Throwable接口

现在try...catch... 可以捕获error类型的错误了。php5的时候很多类型是捕获不了的,即使使用了set_error_handler()来处理。在php7里面这些都得到了解决。PHP7引入 Throwable 接口,错误及异常都实现了 Throwable,我们可以用 Throwable 捕捉异常跟错误。Exception 是所有PHP及用户异常的基类;Error 是所有内部PHP错误的基类。

try {
    undefinedFuntion();
} catch (\Error $e) {
    echo $e->getMessage(), PHP_EOL;
}

try {
    undefinedFuntion();
} catch (\Throwable $e) {
    echo $e->getMessage(), PHP_EOL;
}

Closure::call()

Closure::call()可以绑定一个方法到对象上闭包并调用它。

class Test{
   private $num = 1;
}
$f = function(){
  return $this->num + 1;   
};
echo $f->call(new Test);

intdiv 函数

新增加了intdiv()函数,接收两个参数,返回值为第一个参数除于第二个参数的值并取整

var_dump(intdiv(10, 3)); // 3
var_dump(intdiv(5,10)); // 0

list方括号写法

//php 7 之前
$list = [1, 2, 3];
list($a, $b, $c) = $list;
//php 7 之后
$list = [1, 2, 3];
[$a, $b, $c] = $list;

抽象语法树

这是一个值得好好研究的特性,此处简单说明下引入这个特性之后的语法影响。
屏幕快照 2019-09-29 17.33.20.png

($a)['b'] = 1

这块代码在php7中,$a会被识别为一个数组。