首页 后端开发 PHP8 PHP8.1新特性大讲解之Enums枚举

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

Nov 10, 2021 pm 03:09 PM
php8

本文系翻译,原文地址: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看起来像这样:

$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枚举的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

php5和php8有什么区别 php5和php8有什么区别 Sep 25, 2023 pm 01:34 PM

php5和php8的区别在性能、语言结构、类型系统、错误处理、异步编程、标准库函数和安全性等方面。详细介绍:1、性能提升,PHP8相对于PHP5来说在性能方面有了巨大的提升,PHP8引入了JIT编译器,可以对一些高频执行的代码进行编译和优化,从而提高运行速度;2、语言结构改进,PHP8引入了一些新的语言结构和功能,PHP8支持命名参数,允许开发者通过参数名而不是参数顺序等等。

php8怎么加mysql扩展 php8怎么加mysql扩展 Oct 07, 2023 pm 03:31 PM

php8加mysql扩展的步骤是:1、安装MySQL客户端库;2、安装PHP 8的开发工具;3、下载MySQL扩展源代码;4、编译和安装MySQL扩展;5、启用MySQL扩展;6、重启Web服务器即可。

图文详解apache2.4+php8.0的安装配置方法 图文详解apache2.4+php8.0的安装配置方法 Dec 06, 2022 pm 04:53 PM

本文给大家介绍如何安装apache2.4,以及如何配置php8.0,文中附有图文详细步骤,下面就带大家一起看看怎么安装配置apache2.4+php8.0吧~

php8怎么连接数据库 php8怎么连接数据库 Nov 16, 2023 pm 02:41 PM

PHP8可以使用mysqli和PDO来连接数据库。详细介绍:1、使用mysqli连接数据库,通过传入数据库服务器名称、用户名、密码和数据库名称来进行连接。然后,使用`connect_error`属性来检查连接是否成功,如果连接失败,则输出错误信息。最后,通过调用`close()`方法关闭连接;2、使用PDO连接数据库,通过传入数据库服务器名称、密码和数据库名称来进行连接等等。

php8数据类型怎么转换 php8数据类型怎么转换 Nov 16, 2023 pm 02:51 PM

php8数据类型的方法有字符串转换为整数、整数转换为字符串、字符串转换为浮点数、浮点数转换为字符串、数组转换为字符串、字符串转换为数组、布尔值转换为整数、整数转换为布尔值和变量类型判断和转换。详细介绍:1、字符串转换为整数包括intval()函数和(int)强制类型转换;2、整数转换为字符串包括strval()函数和(string)强制类型转换;3、字符串转换为浮点数等等。

一文深入了解 PHP 8 中的 JIT 一文深入了解 PHP 8 中的 JIT Apr 25, 2022 pm 08:46 PM

本篇文章带大家了解一下PHP 8 中的 JIT,并聊聊JIT 是怎么参与解释流程的,希望对大家有所帮助!

php8到底有哪些性能提升 php8到底有哪些性能提升 Dec 21, 2023 pm 02:44 PM

php8提高的性能包括:1、JIT编译器的引入;2、函数调用的优化;3、垃圾回收机制的改进;4、类型系统的改进;5、新的语言特性;6、优化字符串处理;7、改进数组处理;8、引入新的内存管理机制;9、优化代码生成。详细介绍:1、JIT编译器的引入,PHP8引入了JIT编译器,这是一种动态编译技术,能够将PHP代码转换为机器码,以便更高效地执行;2、函数调用的优化等等。

php8有什么特性 php8有什么特性 Dec 21, 2023 pm 02:54 PM

php8的特性:1、JIT编译器;2、命名参数;3、联合类型;4、注解;5、构造函数属性提升;6、match表达式;7、nullsafe运算符;8、改进类型系统;9、错误处理改进;10、一致性改进。详细介绍:1、JIT编译器,PHP8引入了即时编译技术,将PHP代码编译成本机机器码,从而提高程序的执行速度;2、命名参数,PHP8支持命名参数,允许在函数调用时使用参数名称等等。

See all articles