PHP8新特性

时间:2021-9-14     作者:smarteng     分类: PHP相关


PHP8新特性

b433389094218825216f7f3ac69f5_w780_h517.png
JIT作为PHP8最重要的特性,又进一步提升了PHP执行的速度,从图中可以看到,JIT在opcache的基础
上,又进一步可以将一些高频执行的函数解析成机器码,直接交给CPU,而无需经过Zend虚拟机。官方给出的提升效果最多可以达到PHP7.x的3倍左右。那么如何开启JIT呢?当然离不开PHP的配置文件php.ini。
1、opcache.enable=1
首先要开启JIT,必须要保证开启opcache功能
2、opcache.jit_buffer_size
设置存储jit code需要使用的空间,如果设置为0,则无法使用JIT功能,这里可根据服务器具体配置设置合适的值
3、opcache.jit
此选项设置JIT具体运行的模式,支持4位配置值或别名(function,tracing),默认使用tracing。
这里首先解释下两个别名:
Function JIT:
通过JIT编译整个函数,无需跟踪常用代码结构。
Tracing JIT(默认):
试图识别经常使用的代码部分,并选择性的编译这些结构,以在编译时间和内存使用之间取得最佳平衡。
如果想更细的配置JIT运行模式,

可使用4位配置值

C:CPU特定的优化标志
0:禁用
1:启用

R:寄存器分配
0:不执行寄存器分配
1:执行块本地寄存器分配
2:执行全局寄存器分配

T:触发器
0:在脚本加载时编译所有函数
1:首次执行时编译所有函数
2:剖析第一个请求,然后编译最热的函数
3:即时分析并编译热函数
4:当前未使用
5:使用tracing JIT

O:优化级别
0:没有JIT
1:最小JIT
2:内联VM处理程序
3:使用类型推断
4:使用调用图
5:优化整个脚本

Function JIT对应的4位配置值是1205,Tracing JIT对应的4位配置值是1254

二、语法糖
1、命名参数

function route($name, $controller="UserController", $model="index")
{
//todo
}
//PHP7
route("user/login", "UserController", "login");
//PHP8
route(name:"user/login", model:"login");

这样对于中间几个参数使用默认值,最后一个参数不使用默认值的情况,就可以省略中间的参数了。
2、构造器属性提升

//PHP7
class User {
public $name;
public $phone;
public $sex;

public function __construct($name, $phone, $sex)
{
$this->name = $name;
$this->phone = $phone;
$this->sex = $sex;
}
}
//PHP8
class User {
public function __construct(
    public string $name = "zhangsan", 
    public string $phone = "111", 
    public string $sex = "男"
){}
}

可以看到成员变量可以在构造器的参数中定义。
3、match

//PHP7
switch (1) {
    case 0:
        $result = 'Foo';
        break;
    case 1:
        $result = 'Bar';
        break;
    case 2:
        $result = 'Baz';
        break;
    default:
        $result = 'default';
} 
echo $result;
//PHP8
echo match (1) {
    0 => 'Foo',
    1 => 'Bar',
    2 => 'Baz',
    default => 'default'
};

4、Nullsafe运算符

//PHP7
$country =  null;
if ($session !== null) {
    $user = $session->user;

    if ($user !== null) {
        $address = $user->getAddress();

        if ($address !== null) {
            $country = $address->country;
        }
    }
}
//PHP8
$country = $session?->user?->getAddress()?->country;

此方法对于多层对象的数据结构的非空判断可以说是很方便哦~
以上是楼主觉得工作中可能会比较有用的几个新语法,更多新语法可参考https://www.php.net/manual/zh/migration80.new-features.php
三、PHP7升级至PHP8
由于一些重要函数的废弃已经在PHP7中完成了,所以PHP7升级至PHP8,并不需要像PHP5升级到PHP7那么费劲,但仍然会有一些不兼容和废弃的函数,具体可参考https://www.php.net/manual/zh/migration80.php
想了解更全面的内容请参考:https://www.php.net/releases/8.0/en.php

标签: php