PHP8 新特性:命名参数、Match 表达式、Nullsafe 操作符

命名参数

php7

1
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8'false);

php8

1
htmlspecialchars($string, double_encodefalse);
  • 只指定必需参数,跳过可选参数。
  • 参数是独立于顺序并且是自描述的。

demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Test {
public function __construct(
public string $name = '',
public int $age = 0,
) {
}

public function getAge(): int
{
return $this->age;
}
}

$test = new Test(age:18)
$test->getAge();

Match 表达式

php7

1
2
3
4
5
6
7
8
9
10
switch (8.0) {
  case '8.0':
    $result "Oh no!";
    break;
  case 8.0:
    $result "This is what I expected";
    break;
}
echo $result;
//> Oh no!

php8

1
2
3
4
5
echo match (8.0) {
  '8.0' => "Oh no!",
  8.0 => "This is what I expected",
};
//> This is what I expected

match 类似于 switch,具有如下特性:

  • match 为表达式,意味着其结果可以存储在变量中或用于返回。
  • match 分支仅支持单行表达式,同时不需要 break; 语句。
  • match 使用严格比较。

Nullsafe 操作符

php7

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$country =  null;

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

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

    if ($address !== null) {
      $country $address->country;
    }
  }
}

php8

1
$country $session?->user?->getAddress()?->country;

可使用 nullsafe 操作符完成链式调用来代替 null 的验证。当对链中的一个元素求值失败时,整个链的执行将中止,整个链的求值为 null

新类、接口、和函数

New Classes, Interfaces, and Functions·

  • Weak Map 类
  • Stringable 接口
  • str_contains(), str_starts_with(), str_ends_with()
  • fdiv()
  • get_debug_type()
  • get_resource_id()
  • token_get_all() 对象实现
  • New DOM Traversal and Manipulation APIs