php8.0已发布-新特性
嘻嘻发布于2020-12-14
最后更新于2020年12月14日
浏览PHP8.0是PHP语言的最新版本,已经在11月26号发布了,如果之前你还在观望,现在可以来尝尝鲜。它包含了很多新功能与优化项, php8新特性包括命名参数、联合类型、注解、构造器属性提升、match 表达式、nullsafe 运算符、JIT,并改进了类型系统、错误处理、语法一致性。你也可以点击这里,查看官网的说明。
命名参数
通常,我们会看到带有包含默认值的参数的方法,而我们要更改的唯一方法是最后一个方法。这迫使我们为所有第一个条目写空值,以便仅修改最后一个。
在PHP 8.0中添加了“命名参数”功能 ,使我们可以跳过函数或方法的参数,而仅将值设置为我们关心的参数。必须为此命名它们。看起来是这样的:
<?php
function myFunc(
$a = 10,
$b = 20,
$c = null
) {
}
myFunc(c: 100);
// $a = 10; $b = 20; $c = 100
构造器属性提升
更少的代码来定义并初始化属性。
class Point {
public function __construct(
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0,
) {}
联合类型
相较于以前的 PHPDoc 声明类型的组合, 现在可以用原生支持的联合类型声明取而代之,并在运行时得到校验。
class Number {
public function __construct(
private int|float $number
) {}
}
new Number('NaN'); // TypeError
Match表达式
新的 match 类似于 switch,并具有以下功能:
- Match 是一个表达式,它可以储存到变量中亦可以直接返回。
- Match 分支仅支持单行,它不需要一个 break; 语句。
- Match 使用严格比较
echo match (8.0) { '8.0' => "Oh no!", 8.0 => "This is what I expected", }; //> This is what I expected
Nullsafe 运算符
现在可以用新的 nullsafe 运算符链式调用,而不需要条件检查 null。 如果链条中的一个元素失败了,整个链条会中止并认定为 Null。
$country = $session?->user?->getAddress()?->country;
字符串与数字的比较更符合逻辑
PHP 8 比较数字字符串(numeric string)时,会按数字进行比较。 不是数字字符串时,将数字转化为字符串,按字符串比较。
0 == 'foobar' // false
内部函数类型错误的一致性
现在大多数内部函数在参数验证失败时抛出 Error 级异常。
strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given
array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0
JIT
PHP 8 引入了两个即时编译引擎。 Tracing JIT 在两个中更有潜力,它在综合基准测试中显示了三倍的性能, 并在某些长时间运行的程序中显示了 1.5-2 倍的性能改进。 典型的应用性能则和 PHP 7.4 不相上下