您现在的位置是:自如初>PHP基础PHP基础

PHP 8.2 新特性之 DNF Types

温新 2023-02-21 14:38:08 PHP基础 706人已围观

简介PHP 8.2 新特性之 DNF Types。PHP 8.2 引入一个新的类型叫 DNF(Disjunctive Normal Form)。这个类型是 | 和 & 运算符的组合。它允许指定一种类型是两个或多个类型的联合,而每个类型是一个或多个其他类型的交集。

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();
}


很赞哦!(10)

文章评论

登录 注册

自如初--时间轴

站名:自如初

独白:向前走!向前走!

邮箱:ziruchu@qq.com

RSS: RSS

站点信息