PHP 8.2 新特性之 DNF Types

作者: 温新

分类: 【PHP基础】

阅读: 1413

时间: 2023-02-21 06:38:08

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 实例对象必须实现 AdminSuperAdmin 接口。

$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();
}
请登录后再评论