This article is a translation, original address: https://stitcher.io/blog/php-enums
PHP 8.1: Enumerations
They're finally here - built-in support for enums will be added in PHP 8.1! Some may think they should have done this a long time ago, but you didn't hear my complaint; I'm glad they did! This article is dedicated to a deep dive into the newly added features.
As usual in my PHP feature posts, we start with a high-level overview of what enumerations look like:
enum Status { case DRAFT; case PUBLISHED; case ARCHIVED; }
The benefit of enumerations is that they represent a set of constant values, but The most important thing is that these values can be typed like this:
class BlogPost { public function __construct( public Status $status, ) {} }
In this example, creating an enum and passing it to aBlogPost looks like this:
$post = new BlogPost(Status::DRAFT);
That's it The basics, as you can see, they are not complicated at all. While there are a lot of side notes to make, let’s take a deeper look at enumerations!
#Enumeration methods
Enumerations can define methods, just like classes. This is a very powerful feature, especially when combined with the match operator:
enum Status { case DRAFT; case PUBLISHED; case ARCHIVED; public function color(): string { return match($this) { Status::DRAFT => 'grey', Status::PUBLISHED => 'green', Status::ARCHIVED => 'red', }; } }
Methods can be used like this:
$status = Status::ARCHIVED; $status->color(); // 'red'
Static methods are also allowed:
enum Status { // … public static function make(): Status { // … } }
You can also use self in an enumeration:
enum Status { // … public function color(): string { return match($this) { self::DRAFT => 'grey', self::PUBLISHED => 'green', self::ARCHIVED => 'red', }; } }
#Enumeration interface
Enumerations can implement interfaces, just like ordinary classes:
interface HasColor { public function color(): string; } enum Status implements HasColor { case DRAFT; case PUBLISHED; case ARCHIVED; public function color(): string { /* … */ } }
# Enumeration values - aka "backed enums"
Enumeration values are represented internally by objects, but you can assign values to them as needed; this is useful for e.g. it works. Serialize them into the database.
enum Status: string { case DRAFT = 'draft'; case PUBLISHED = 'published'; case ARCHIVED = 'archived'; }
Pay attention to the type declaration in the enumeration definition. It indicates that all enumeration values belong to the given type. You can also make it an int. Note that onlyint and string are allowed as enumeration values.
enum Status: int { case DRAFT = 1; case PUBLISHED = 2; case ARCHIVED = 3; }
The technical term for type enums is called "backed enumerations" because they are "backed" by simpler values. If you decide to assign an enumeration value, all cases should have a value. You can't mix and match them. Enumerations without "backing" are called "pure enumerations".
#Supported enumerations with interfaces
If you use a supported enumeration with an interface, the enumeration type must come directly after the enumeration name, implements before the keyword.
enum Status: string implements HasColor { case DRAFT = 'draft'; case PUBLISHED = 'published'; case ARCHIVED = 'archived'; // … }
#Serialization supported enums
If you are assigning values to enum cases, you may need a way to serialize and deserialize them . Serializing them means you need a way to access the enum values. This is done via a read-only public property:
$value = Status::PUBLISHED->value; // 2
The enumeration can be restored from the value using: Enum::from
$status = Status::from(2); // Status::PUBLISHED
If an unknown value is passed tryFrom, there is also a return null. There is an exception if you use from.
$status = Status::from('unknown'); // ValueError $status = Status::tryFrom('unknown'); // null
Please note that you can also use the built-in serialize and unserialize functions on enumerations. Additionally, you can use json_encode with a supported enumeration and the result will be an enumeration value. This behavior can be overridden by implementing JsonSerializable.
#Listing enumeration values
You can get a list of all available cases in an enumeration using the static method: Enum::cases()
Status::cases(); /* [ Status::DRAFT, Status::PUBLISHED, Status::ARCHIVED ] */
Please note that this array contains the actual enumeration objects:
array_map( fn(Status $status) => $status->color(), Status::cases() );
#Enumerations are objects
I already mentioned that enumeration values are represented as objects, actual Above they are singleton objects. This means you can compare to them like this:
$statusA = Status::PENDING; $statusB = Status::PENDING; $statusC = Status::ARCHIVED; $statusA === $statusB; // true $statusA === $statusC; // false $statusC instanceof Status; // true
# Enums as Array Keys
Since enum values are actually objects, there is currently no way to They are used as array keys. The following will result in an error:
$list = [ Status::DRAFT => 'draft', // … ];
There is an RFC to change this behavior, but it has not been voted on yet.
This means you can only use enums as keys in SplObjectStorage and WeakMaps.
#Traits
Enumerations can use traits just like classes, but with more restrictions. Overriding built-in enumeration methods is not allowed, and they cannot contain class attributes - their use in enumerations is prohibited.
#Reflection and Properties
As expected, a few reflection classes have been added to handle enumerations: ReflectionEnum, ReflectionEnumUnitCase and ReflectionEnumBackedCase. There is also a new enum_exists function, which does exactly what its name suggests.
Just like ordinary classes and attributes, enumerations and their cases can be annotated using attributes. Note that the TARGET_CLASS filter will also include enumerations.
One last thing: the enumeration also has a read-only attribute, which the RFC mentions is an implementation detail and should only be used for debugging purposes. But it's still worth mentioning. $enum->name
The above is the detailed content of PHP8.1 new features explained Enums enumeration. For more information, please follow other related articles on the PHP Chinese website!

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

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

本文给大家介绍如何安装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支持命名参数,允许在函数调用时使用参数名称等等。


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

SublimeText3 Linux new version
SublimeText3 Linux latest version

SecLists
SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

WebStorm Mac version
Useful JavaScript development tools

SublimeText3 English version
Recommended: Win version, supports code prompts!
