PHP7 具有很多用于编写高性能、高效代码的新特性,同时也剔除了一些历史版本中过时的特性。
类型声明
默认情况下,所有的PHP文件都处于弱类型校验模式。
<?php
// 1:默认值,表示严格类型校验模式,不符则抛 Fatal error
// 0:表示弱类型校验模式。
declare(strict_types=1);
// 规定形参、返回值类型
function sum(int ...$ints):int
{
return array_sum($ints);
}
print(sum(1,2,3));
存在意义:声明类型之后,使得函数、方法的形参与返回值有所预期,并且省去了对数据类型的检测,提高执行效率。
use 关键字批量声明
PHP 7 可以使用一个 use 从同一个 namespace 中导入类、函数和常量:
// PHP 7 之前版本需要使用多次 use
use some\namespace\ClassA;
use some\namespace\ClassB;
use function some\namespace\fn_a;
use const some\namespace\ConstA;
// PHP 7+ 之后版本可以使用一个 use 导入同一个 namespace 的类
use some\namespace\{ClassA
, ClassB as B
, function fn_a
, const ConstA
};
存在意义:提高了代码可读性。
匿名类
匿名类可以用来替代一些"用后即焚"的完整类定义,虽然匿名类没有命名,但在内存的引用地址表中为其分配一个全局唯一的名称。
$name = new class(){
public function __construct()
{
// class@anonymous/Users/atong/htdocs/test.php0x104601063
echo get_class();
}
};
存在意义:匿名类的一次性任务代码流程对性能提升帮助很大(高性能PHP7 p28)。
不推荐使用老式构造方法
老式的构造函数在PHP7中依然可用,但会产生不被推荐的信息,并且使用 __construct 时,老式的构造函数失效。
class Atong {
public function Atong(){
echo "function atong is called";
}
public function __construct(){
echo "function __construct is called";
}
}
$atong = new Atong();
// function __construct is called
存在意义:统一和规范。
5 Throwable 接口
在PHP 7之前异常可以被截获,但是错误不能被截获。从PHP 7之后,任何完整程序或者一部分中的Fatal错误可以被截获。
try {
$value = 1 % 0;
} catch (\DivisionByZeroError $e) {
// TODO::记录日志
}
echo "it's still running .. ";
存在意义:更合理的异常处理。
太空飞船操作符(<=>)
太空船运算符(组合比较符)在比较变量时非常有用。
// 左大于右时:1
echo (1 <=> 0);
// 两边相等时:0
echo (1 <=> 1);
// 右大于左时:-1
echo (1 <=> 2);
存在意义:更少的代码实现更多的事。
null 合并运算符(??)
空合并运算符可以用来取代三元运算与 isset () 函数。
if(isset($_GET["a"]))
$a = $_GET["a"];
else
$a = "test";
// 等效
$a = isset($_GET["a"]) ? $_GET["a"] : "test";
// 等效
$a = $_GET['a'] ?? "test";
存在意义:和 ?: 一样,代码更精简。
统一变量语法
$first = ["name" => "second"];
$second = "atong";
// Notice ..
echo $$first["name"];
// atong,php7要求的语法规范
echo ${$first["name"]};
存在意义:规范。
常量数组
// php5.6 开始可以使用 const 关键字声明数组常量
const STORES = ['en','fr','ar'];
// php7 常量数组可以通过 define 函数声明
define("STORES",['en','fr','ar']);
Switch 中的多个默认值
PHP7 之前,多个 default 默认值在 switch语句中是被允许的,PHP7开始,这样的代码会产生 Fatal 级别错误。
存在意义:规范。
Session_start 函数中的选项数组
PHP7 之前,session_start() 函数没有参数需要传递,session 的配置都在 php.ini 中,PHP 7 之后 session_start() 函数可以接收一个数组作为参数,可以覆盖php.ini中session的配置项。
session_start([
'cache_limiter' => 'private',
'read_and_close' => true,
]);
Unserialize 函数引入过滤器
通常使用serialize和unserialize两个方法分别对对象进行序列化和反序列化。然而,unserialize()函数并不安全,因为没有任何过滤项,并且可以反序列化任何类型的对象。因此PHP 7引入过滤器,默认情况下允许反序列化所有类型的对象。使用方法如下:
$result = unserilize($object, ['allowed_classes' => ['Packt', 'Books', 'Ebooks']]);
参考:《高性能PHP7,Learning PHP7 High Performance》