您的当前位置:首页>全部文章>文章详情

【PHP】PHP8.1新特性大讲解之Enums枚举

CrazyPanda发表于:2024-01-03 23:59:57浏览:462次TAG:

PHP 8.1:枚举

它们终于来了——PHP 8.1中将添加对枚举的内置支持!有些人可能认为他们早就应该这样做了,但你没有听到我的抱怨;我很高兴他们做到了!这篇文章致力于深入研究新添加的功能。

像往常一样,在我的 PHP 功能帖子中,我们首先对枚举的外观进行高级概述:

enum Status
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
}

枚举的好处是它们代表了一组常量值,但最重要的是这些值可以被键入,如下所示:

class BlogPost
{
    public function __construct(
        public Status $status,
    ) {}
}

在这个例子中,创建一个枚举并将其传递给 aBlogPost看起来像这样:

$post = new BlogPost(Status::DRAFT);

这就是基础知识,正如您所看到的,它们一点也不复杂。虽然有很多旁注需要做,让我们深入看看枚举!

#枚举方法

枚举可以定义方法,就像类一样。这是一个非常强大的功能,尤其是与match运算符结合使用时:

enum Status
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
     
    public function color(): string
    {
        return match($this)
        {
            Status::DRAFT => 'grey',  
            Status::PUBLISHED => 'green',  
            Status::ARCHIVED => 'red',  
        };
    }
}

方法可以像这样使用:

$status = Status::ARCHIVED;
$status->color(); // 'red'

静态方法也是允许的:

enum Status
{
    // …
     
    public static function make(): Status
    {
        // …
    }
}

您还可以self在枚举中使用:

enum Status
{
    // …
     
    public function color(): string
    {
        return match($this)
        {
            self::DRAFT => 'grey',  
            self::PUBLISHED => 'green',  
            self::ARCHIVED => 'red',  
        };
    }
}

#枚举接口

枚举可以实现接口,就像普通类一样:

interface HasColor
{
    public function color(): string;
}
enum Status implements HasColor
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
     
    public function color(): string { /* … */ }
}

#枚举值——又名“支持枚举”

枚举值在内部由对象表示,但您可以根据需要为它们赋值;这对于例如很有用。将它们序列化到数据库中。

enum Status: string
{
    case DRAFT = 'draft';
    case PUBLISHED = 'published';
    case ARCHIVED = 'archived';
}

注意枚举定义中的类型声明。它表示所有枚举值都属于给定类型。您也可以将其设为int. 请注意, onlyint和string允许作为枚举值。

enum Status: int
{
    case DRAFT = 1;
    case PUBLISHED = 2;
    case ARCHIVED = 3;
}

类型枚举的技术术语称为“支持枚举”,因为它们由更简单的值“支持”。如果您决定分配枚举值,则所有案例都应该有一个值。你不能混合和匹配它们。没有“支持”的枚举被称为“纯枚举”。

#带接口的支持枚举

如果您将支持的枚举和接口结合使用,则枚举类型必须直接位于枚举名称之后,implements关键字之前。

enum Status: string implements HasColor
{
    case DRAFT = 'draft';
    case PUBLISHED = 'published';
    case ARCHIVED = 'archived';
     
    // …
}

#序列化支持的枚举

如果您要为枚举案例分配值,您可能需要一种方法来序列化和反序列化它们。序列化它们意味着您需要一种访问枚举值的方法。这是通过只读公共属性完成的:

$value = Status::PUBLISHED->value; // 2

可以使用以下方法从值中恢复枚举:Enum::from

$status = Status::from(2); // Status::PUBLISHED

如果传递了未知值tryFrom,还有一个返回null。如果你会使用from会有一个例外。

$status = Status::from('unknown'); // ValueError
$status = Status::tryFrom('unknown'); // null

请注意,您还可以在枚举上使用内置函数serialize和unserialize函数。此外,您可以json_encode与支持的枚举结合使用,其结果将是枚举值。可以通过实现来覆盖此行为JsonSerializable。

#列出枚举值

您可以使用静态方法获取枚举中所有可用案例的列表:Enum::cases()

Status::cases();
/* [
    Status::DRAFT,
    Status::PUBLISHED,
    Status::ARCHIVED
] */

请注意,此数组包含实际的枚举对象:

array_map(
    fn(Status $status) => $status->color(),
    Status::cases()
);

#枚举是对象

我已经提到枚举值表示为对象,实际上它们是单例对象。这意味着您可以像这样与它们进行比较:

$statusA = Status::PENDING;
$statusB = Status::PENDING;
$statusC = Status::ARCHIVED;
$statusA === $statusB; // true
$statusA === $statusC; // false
$statusC instanceof Status; // true

#枚举作为数组键

由于枚举值实际上是对象,因此目前无法将它们用作数组键。以下将导致错误:

$list = [
    Status::DRAFT => 'draft',
    // …
];

有一个 RFC来改变这种行为,但它还没有被投票。

这意味着您只能使用枚举作为SplObjectStorage和 中的键WeakMaps。

#性状

枚举可以像类一样使用特征,但有更多限制。不允许覆盖内置的枚举方法,并且它们不能包含类属性 - 枚举中禁止使用这些属性。

#反射和属性

正如预期的那样,添加了一些反射类来处理枚举:ReflectionEnum、ReflectionEnumUnitCase和ReflectionEnumBackedCase。还有一个新enum_exists功能,正如它的名字所暗示的那样。

就像普通的类和属性一样,枚举及其案例可以使用attributes进行注释。请注意,TARGET_CLASS过滤器还将包括枚举。

最后一件事:枚举也有一个只读属性,RFC 提到这是一个实现细节,应该只用于调试目的。不过还是值得一提的。$enum->name


猜你喜欢

【PHP】RabbitMQ简介
1. RabbitMQ简介AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP 中消息的路由过程和 Java 开发者熟悉的 JMS 存在一些差别,AMQP 中增加了 Exchange 和 Binding 的角色。生产者把消息发布到
发表于:2024-06-11 浏览:257 TAG:
【PHP】PHP实现图片验证码的生成和验证
PHP实现图片验证码的生成和验证在网站开发中,为了防止机器恶意攻击或者自动注册,我们经常会使用图片验证码来进行验证。本文将介绍如何使用PHP来生成和验证图片验证码,并给出具体的代码示例。生成图片验证码生成图片验证码的关键是生成随机的验证码字符串,并将其绘制到图片上。以下是一个生成图片验证码的示例代码:<?php session_start();   // 声明图片尺寸 $image_width = 100; $image_height&nb
发表于:2023-12-28 浏览:301 TAG:
【PHP】微信支付v3的jsapi接口接入thinkphp6完整流程
        相信,写过微信支付接口的程序员,都会骂一句,什么垃圾文档。惠州网站建设今天给个完整的解决案例。哎,绕来绕去,把你绕坑里。我也是不知道掉了多少坑才写出这个避坑文档。目的是想让自己记住thinkphp6在接入微信支付v3时候jsapi的时候,不要在掉一次坑。因为,官网文档的说明内容真的让人无语。都严重怀疑,他不想让人成功接入他们支付一样。        下面说下我们
发表于:2023-12-01 浏览:794 TAG:
【PHP】PHP和WebSocket: 实现实时数据传输的最佳实践方法
PHP和WebSocket:实现实时数据传输的最佳实践方法引言:在Web应用程序开发中,实时数据传输是一项非常重要的技术需求。传统的HTTP协议是一种请求-响应模式的协议,不能有效地实现实时数据传输。为了满足实时数据传输的需求,WebSocket协议应运而生。WebSocket是一种全双工通信协议,它提供了一种在单个TCP连接上进行全双工通信的方式。相比于HTTP协议,WebSocket能够实现更快速的数据传输和实时的数据推送。由于其出色的性能和广泛的支持,WebSocket在实时应用
发表于:2023-12-27 浏览:295 TAG:
【PHP】php中向数组增加元素
在PHP编程中,数组是非常常用的一种数据类型。数组的特点在于可以存储一组数据,并且可以通过索引或者键值来访问这些数据。在编写PHP代码时,我们经常需要向数组中增加新的元素。本文将介绍如何在PHP中向数组增加元素。一、向数组尾部添加元素首先,我们来介绍在数组尾部添加新元素的方法。可以使用PHP内置函数array_push()向数组末尾添加一个或者多个元素。语法如下:array_push($array, $value1, $value2, ...)其中,$array表示要添加元素的目标数组
发表于:2023-12-20 浏览:307 TAG:
【PHP】怎么取出php数组的前几个元素
        取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。详细介绍:1、使用array_slice()函数,可以从数组中取出指定范围的元素,并返回一个新的数组,可以通过设置第三个参数来指定需要取出的元素个数等等。PHP是一种广泛使用的编程语言,它提供了许多强大的数组操作函数和方法。在PHP中,我们可
发表于:2023-12-14 浏览:399 TAG:
【PHP】什么是微服务架构
随着互联网的不断发展,越来越多的网站和应用程序应运而生。而对于开发者来说,如何快速高效地构建应用程序,是一个重要的挑战。其中,微服务架构已经成为了一个越来越受欢迎的解决方案。而php作为一种最受欢迎的web开发语言之一,也已经成为了很多开发者在构建微服务架构时的首选语言。本文将为大家介绍PHP如何应用于微服务架构,帮助大家更好地理解微服务架构以及如何使用PHP构建高效的微服务应用程序。什么是微服务架构?微服务架构(Microservices Architecture)是一种构建分布式应用程序的软
发表于:2024-05-23 浏览:294 TAG:
【PHP】PHP框架在大型电子商务和SaaS平台中的应用场景和挑战
hp框架在大型电子商务和saas平台中广泛用于构建购物车、用户管理和数据处理等功能。应用场景包括但不限于电子商务平台的购物车和支付网关构建,以及saas平台的用户管理和数据存储功能开发。然而,这些平台也面临着性能、可扩展性、安全和维护方面的挑战。PHP框架在大型电子商务和SaaS平台中的应用场景和挑战简介PHP是一种广泛使用的后端编程语言,凭借其灵活性、广泛的库支持和易于使用性,在大型电子商务和SaaS平台中备受青睐。本文将探讨这些平台中PHP框架的应用场景和面临的挑战。应用场景电子商务:构建
发表于:2024-05-30 浏览:272 TAG:
【PHP】PHP8.0中的异步函数
hp8.0是php语言的最新版本,在其中新增了一些非常重要的功能,其中最为突出的一项就是异步函数的支持。本文将着重介绍php8.0中的异步函数,包括异步编程的概念、优点以及在php8.0中的具体应用。异步编程概念在传统的编程方式中,程序是通过按照代码的顺序依次执行来完成任务的。也就是说,如果一个操作需要等待另一个操作完成之后才能继续执行,那么程序就必须一直等待,直到该操作完成。这种方式也称为同步编程。而异步编程则是一种不同的编程方式。在异步编程中,程序不需要等待某个操作完成之后才能继续执行,而
发表于:2024-07-29 浏览:243 TAG:
【PHP】php代码规范七大原则
hp代码规范七大原则包括一致性、可读性、简洁性、可复用性、可测试性、安全性和性能。详细介绍:1、一致性,代码应该保持一致性,即在整个代码库中使用相同的命名规范、缩进风格、代码注释等,这样可以使团队成员更容易理解和阅读代码,减少出错和混淆的可能性;2、可读性,代码应该易于阅读和理解,为了提高可读性,可以使用有意义的变量和函数命名,避免使用过于复杂的表达式和嵌套结构等等。本教程操作系统:windows10系统、PHP 8.1.3版本、DELL G3电脑。在PHP开发中,遵循良好的代码规范是非常重要
发表于:2024-03-17 浏览:304 TAG: