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看起来像这样:
$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中文网其他相关文章!

热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

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

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

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

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

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

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

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