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

本文系翻译,原文地址:https://stitcher.io/blog/php-enums

php 8.1:枚举

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

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

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

登录后复制

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

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

登录后复制

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

立即学习“PHP免费学习笔记(深入)”;

$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

以上就是PHP8.1新特性大讲解之Enums枚举的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2166459.html

(0)
上一篇 2025年2月25日 09:40:28
下一篇 2025年2月25日 09:40:45

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • php8有什么新特性

    php8新特性有JIT 编译器、类型推导、命名参数、联合类型、属性、错误处理改进、异步编程支持、新的标准库函数和匿名类的扩展等。详细介绍:1、JIT编译器,PHP8引入了JIT编译器,这是一个重要的性能改进,JIT编译器可以对一些高频执行的…

    2025年3月13日
    200
  • 全方位解读php8.0版本优化与改进

    除非你一直生活在一块石头下,或者生活在过去,否则你会意识到JIT正在进入PHP 8:投票今天悄然结束,绝大多数人赞成合并到PHP8,所以,这是正式的,本文全方位解读php8.0版本优化与改进。 PHP8 官宣《PHP 8 来了! PHP团队…

    2025年3月13日
    200
  • php8条件判断有哪些?php8中三元运算符是什么意思?

    上篇文章给大家介绍了《什么是php运算符,我们对于php运算符如何使用?》,本文继续给大家介绍php8条件判断有哪些?php8中三元运算符是什么意思?(附代码)有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 php8条件判…

    2025年3月5日 编程技术
    200
  • PHP 8 中新特性以及重大调整

    PHP 8,PHP 的一个新的大版本,预计将于2020年12月3日发布,这意味着将不会有 PHP 7.5 版本。PHP8目前正处于非常活跃的开发阶段,所以在接下来的几个月里,情况可能会发生很大的变化。 在这篇文章中,我会维持一个最新的清单列…

    2025年2月25日
    200
  • PHP 8 能有多快?(性能测试)

    Phoronix 发布了针对 PHP 8 的性能基准测试报告。由于 PHP 8 Alpha1 大约要到6月中旬才发布,所以 Phoronix 从 PHP 8 最新的 Git 代码(截至5月底)构建了用于测试的版本。PHP 8 重要新特性除了…

    2025年2月25日 编程技术
    200
  • 最新消息!PHP 8 正式版将于2020年底发布!

    最新消息,PHP开发社区开始加快脚步——原计划发布的主版本 8.0,预计将在2020年12月正式发布。 目前已经在PHP维基百科(https://wiki.php.net/todo/php80)中公布并确认了PHP 8.0的准备任务的目标与…

    2025年2月25日
    200
  • php8具体发布时间表一览!

    php8 发布时间表 PHP 8计划于2020年12月的第一周发布!Alpha的第一个版本已于2020年6月发布。像往常一样,这是查找错误,要求更改的好时机,并且仍有很短的时间可以提交您的更新。 相关文章:《PHP 8 来了! PHP团队发…

    2025年2月25日
    400
  • PHP 8.0 源码编译安装以及 JIT 尝鲜

    奇技指南 PHP 8.0 Alpha 1 已经在2020年6月25号发布了,今天给大家分享一篇最简化的 PHP 8 源码编译安装方法,快速尝鲜 PHP 8.0 的新特性 JIT。  操作系统:CentOS Linux release 7.4…

    2025年2月25日
    200
  • PHP8 新特性 match 表达式详解

    PHP8 alpha2发布了,最近引入了一个新的关键字:match, 这个关键字的作用跟switch有点类似。 这个我觉得还是有点意思,match这个词也挺好看,那么它是干啥的呢? 在以前我们可能会经常使用switch做值转换类的工作,类似…

    2025年2月25日
    300
  • PHP8新特性之构造函数属性大加强!

                                                            新版本的PHP将于12月3日正式发布。除了大量的bug修复和小的改进,全球的开发人员也将获得一些新的有趣特性。名单虽然还没有结束…

    2025年2月25日 编程技术
    300

发表回复

登录后才能评论