php8.0已发布-新特性

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 不相上下

php8.0-jit

Bash中检测文件或目录是否存在
shell小技巧:将终端输出复制到剪贴板Mac OS X