search
HomeBackend DevelopmentPHP8PHP8.1 new features explained Enums enumeration

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!

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
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服务器即可。

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

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

图文详解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 中的 JITApr 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

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Repo: How To Revive Teammates
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version

SecLists

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

WebStorm Mac version

Useful JavaScript development tools

SublimeText3 English version

SublimeText3 English version

Recommended: Win version, supports code prompts!