PHP7 新特性

一、概况

PHP 7是PHP一个非常重要的版本,相对于PHP 5.x版本,有着非常大的革新,尤其是在性能方面。如果读者的网站使用的是PHP 5.x,那么使用PHP 7后几乎将无成本地得到一倍的性能提升。

二、新特性

PHP 7除了在性能方面有极大提升外,还添加了很多新的特性,如太空船操作符、标量类型声明、返回值的类型声明、全局的throwable接口、抽象语法树等。

(1)太空船操作符

<?php
/**
 * 太空船操作符用于比较两个表达式。
 * 例如,当$a小于、等于或大于$b时,它分别返回-1、0或1。
 */
echo 1 <=> 2; // -1

(2)标量类型声明和返回值的类型声明

/**
 * PHP 7可以对下面几种类型的参数做声明:
 * 字符串(string)、整型(int)、浮点型(float)以及布尔型(bool)。
 * 注意参数类型声明不受制于默认模式和严格模式。
 * 默认模式下,当传入的参数不符合声明类型时,
 * 会首先尝试转换类型(注意:这里的类型转换仅受制于可转换的类型,
 * 例如不能把'a'转为int型。);
 * 而严格模式下,则直接报致命错误。
 *
 * PHP 7.1对函数返回值的声明做了扩充,
 * 可以定义其返回值为void,即不能有返回值,
 * 无论是否开启严格模式,只要函数中有 “return;” 以外的其他return语句都会报错。
 *
 * PHP 7.1.0对参数类型和返回值类型还有进一步的支持,
 * 其类型可以是可空类型,
 * 在参数或返回值类型声明前边加上“?”,表示返回值要么是null,要么是声明的类型
 */

declare(strict_types=1); // 开启严格模式

function say(int... $ints): void
{
    return;
}

function say2(?string $worlds): ?string
{
    return $worlds;
}

echo '<pre>';
var_dump(say(1, 2, 3));
var_dump(say2(null));
var_dump(say2("hello world!"));
var_dump(say2(123)); // 致命错误

(3)null合并操作符

/**
 * PHP 7提供了一个新的语法糖“??”,
 * 如果变量存在且值不为null,它会返回自身的值,否则返回它的第二个操作数。
 */
echo isset($_GET['name']) ? $_GET['name'] : 0,'<br>';
echo $_GET['name'] ?? 0,'<br>';
echo $_GET['name'] ?? $_GET['age'] ?? 0;

(4)常量数组

/**
 * 在PHP 7之前是无法通过define来定义一个数组常量的,PHP 7支持了这个操作
 */
define('HABBIES', ['eat', 'drink', 'play']);

echo '<pre>';
var_dump(HABBIES);

(5)namespace批量导入

<?php

use SpaceClassA;
use SpaceClassB;
use SpaceClassC as C;

// 在PHP 7中支持批量导入:
use Space{
    ClassA,
    ClassB,
    ClassC as C
};

(6)throwable接口

<?php
/**
 * 在PHP 7之前,如果代码中有语法错误,或者fatal error时,程序会直接报错退出,但是在PHP 7中有了改变。
 * PHP 7实现了全局throwable接口,原来的Exception和部分Error实现了该接口。
 * 这种Error可以像Exception一样被第一个匹配的try/catch块捕获。
 * 如果没有匹配的catch块,则调用异常处理函数进行处理。
 * 如果尚未注册异常处理函数,则按照传统方式处理(fatal error)。
 *
 * Error类并非继承自Exception类,所以不能用catch(Exception $e){...}来捕获Error。
 * 可以用catch(Error $e){...},或者通过注册异常处理函数(set_exception_handler())来捕获Error
 */

echo '<pre>';
try {
    undefindfunc();
} catch (Error $e) {
    var_dump($e);
}
//
set_exception_handler(function ($e) {
    var_dump($e);
});
undefindfunc();

(7)Closure::call()

<?php
/**
 * 在PHP 7之前,我们需要动态地给一个对象添加方法时,
 * 可以通过Closure来复制一个闭包对象,并绑定到一个$this对象和类作用域
 * 
 * 在PHP 7中新添加了Closure::call(),
 * 可以通过call来暂时绑定一个闭包对象到$this对象并调用它
 */
class Test
{
    private $num = 1;
}

$f = function() {
    return $this->num + 1;
};

$test = $f->bindTo(new Test, 'Test');
echo '<pre>';
echo $test(),'<br>';
// php7
echo $f->call(new Test);

详见:https://www.cnblogs.com/cshaptx4869/p/10775068.html

(8)intdiv函数

PHP 7还增加了一个新的整除函数,在代码中不需要再手动转了。

(9)list的方括号写法

<?php
$arr = [1, 2, 3];
list($a, $b, $c) = $arr;
// php7 注意:这里的[]并不是数组的意思,只是list的简略形式。
[$a1, $b, $c] = $arr;

除了上述这些,PHP7还有很多其他的改变和特性。

例如,foreach遍历数组时不再修改内部指针、移除了ASP和script PHP标签、移除了$HTTP_RAW_POST_DATA、匿名类、类常量可见性等。

 

原文地址:https://www.cnblogs.com/cshaptx4869/p/10824254.html