php8.0 linux版安装包下载

摘要

PHP8 0新特性,JIT(Just in Time Compiler) 即时编译器,match是PHP8中新增的关键字(即无法再做类名),其作用与switch有点相似,Attributes即注解,它提供了一种向类添加元数据的方法,无需解析文档块 符号为 []

JIT(Just in Time Compiler) 即时编译器

JIT 是一种编译器策略,它将代码表述为一种中间状态,在运行时将其转换为依赖于体系结构的机器码,并即时执行.在 PHP 中,这意味着 JIT 将为 Zend VM 生成的指令视为中间表述,并以依赖于体系结构的机器码执行,也就是说托管代码的不再是 Zend VM,而是更为底层的 CPU.其较之前的流程改动和重点如下


Opcache会做opcode层面的优化,比如图中的俩条opcode合并为一条

PHP8的JIT目前是在Opcache之中提供的

JIT在Opcache优化之后的基础上,结合Runtime的信息再次优化,直接生成机器码

JIT不是原来Opcache优化的替代,是增强

目前PHP8只支持x86架构的CPU

match表达式

match是PHP8中新增的关键字(即无法再做类名),其作用与switch有点相似,用于变量的值转换与赋值,使用如下

$input = true;
$result = match($input) {
"true",true  => 1, //可多值匹配,匹配方式为===,无匹配值会抛出Fatal error
"false"      => 0,
"null"       => NULL,
};
var_dump($result); //输出: int(1)


Attributes(注解)

Attributes即注解,它提供了一种向类添加元数据的方法,无需解析文档块.符号为#[],使用格式为#[param('value1','value2')],可定义多个也可写成数组形式


#[
    param('value1','value2'),
    param2('value3','value4'),
]

且两种形式可混合使用,如下


#[Url1("https://www.3q.fun")]
#[Params1("name1", "age1")]
#[
Params2("name2", "age2"),
Url2("https://www.3q.xn--6qq986b3xl/")
]
function newAttributes($arg = ''){}
$obj = new ReflectionFunction('newAttributes');
$attributes = $obj->getAttributes();
echo'<pre>';
echo($attributes[1]->getName().'<br>');
print_r($attributes[2]->getArguments());
输出为
Params1
Array
(
    [0] => name2
    [1] => age2
)

联合类型Union Types

Union Types 支持声明并接收多个不同类型的值,它是两种或多种类型的集合,使用时可以选择其一


function getParam(string|array|bool $p)
{
var_dump($p);
}
getParam(true);//输出: bool(true)

static 返回类型

虽然已经可以返回 self,但是考虑到 PHP 具有动态类型的性质,PHP 8 中支持 static 返回类型将更加高效


class Test {
public $_name = 'test';
    public function getStatic(): static {
        return new static();
    }
}
$obj = new Test();
var_dump($obj->getStatic()->_name); //输出: string(4) "test"


弱映射WeakMap

WeakMap弱映射的一般用例是将数据与单个对象实例关联起来,而不强制它们保持活动状态,从而在长时间运行的进程中有效地泄漏内存。例如,可以使用弱映射来记录计算结果


class FooBar {
    private WeakMap $cache;
 
    public function getSomethingWithCaching(object $obj) {
        return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj);
    }
 
    // ...
}

如上代码所示,每个对象都只会调用一次computeSomethingExpensive方法,同时,如果对象被销毁,它也会从映射中删除缓存值.


php8.1 linux版安装包下载

PHP 8 1 新特性,用字符串键解包数组 RFC,新增 array_is_list 函数 RFC,八进制整数表示法 RFC,Enums枚举 RFC,限制$GLOBALS使用 RFC,弃用将null传递给内部函数 RFC
阅读全文