PHP 8.2 新特性之 DNF Types
hi,我是温新,一名 PHPer
PHP 8.2 引入一个新的类型叫 DNF(Disjunctive Normal Form)。这个类型是 |
和 &
运算符的组合。它允许指定一种类型是两个或多个类型的联合,而每个类型是一个或多个其他类型的交集
这样说挺不容易理解的,先通过 demo 演示,后续再来解释吧。
<?php
interface User
{
public function getName(): string;
}
interface Admin
{
public function getName(): string;
}
interface SuperAdmin
{
public function getName(): string;
}
// PHP 7 特性,匿名类
$user = new class implements Admin, SuperAdmin {
public function getName(): string
{
return 'PHP 8.2 DNF';
}
};
// 这是重点,看参数,接收的参数含义是:
// 该函数接收一个 同时实现了 Admin 和 SpuerAdmin 接口的 User 对象实例
function get_user_name((Admin & SuperAdmin) | User $user): string
{
return $user->getName();
}
echo get_user_name($user); // 输出:PHP 8.2 DNF
代码解释:
- 1、定义了三个接口,User、Admin、SuperAdmin;
- 2、定义一个匿名类,并实现 Admin、SuperAdmin 接口;
- 3、定义一个函数,该参数使用 dnf 类对参数进行限制,只允许接收同时实现了 Admin 和 SuperAdmin 接口的实例对象调用,否则报错;
- 4、调用函数。
下面将针对几种情况进行演示。
DNF 正确的使用方法
-
A|B|C
-
A|B|(C&D)
-
(A&B&C)|null
使用 & 时,必须使用
()
进行包裹。
A|B|C 用法
A B C 三个接口只要实现其中一个即可
// 该匿名名实现了 User 接口
$user = new class implements User {
public function getName(): string
{
return 'PHP 8.2 DNF';
}
};
// A|B|C 只要有一个实现了即可,否则会报错
function get_user_name(Admin | SuperAdmin | User $user): string
{
return $user->getName();
}
(A&B)|C
实例对象 C 必须实现 A、B两个接口。本案例中 $user
实例对象必须实现 Admin
、SuperAdmin
接口。
$user = new class implements Admin, SuperAdmin{
public function getName(): string
{
return 'PHP 8.2 DNF';
}
};
function get_user_name((Admin & SuperAdmin) | User $user): string
{
return $user->getName();
}
请登录后再评论