一、概况
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、匿名类、类常量可见性等。