PHP Enum:1 分钟速通指南

AI摘要
本文系统介绍了PHP 8.1引入的枚举(Enum)功能。它分为纯枚举和带值的Backed Enum,支持定义、比较、反查、添加方法、实现接口及使用注解。枚举通过`cases()`、`name`和`value`属性增强了代码的类型安全性与可读性,是替代传统常量的推荐实践。

1. Enum 基本概念

PHP 8.1 引入 原生枚举(Enum),用于替代字符串/整数常量,提供更安全的类型定义方式。
Enum 有两类:

  • 纯枚举(Pure Enum):只有枚举项本身,无关联值
  • Backed Enum:每个枚举项都有对应的字符串或整型值


2. 定义枚举

2.1 纯枚举

enum Status {
    case Pending;
    case Approved;
    case Rejected;
}

2.2 Backed Enum(带值)

只能是 stringint

enum Role: string {
    case Admin = 'admin';
    case User  = 'user';
}


3. 枚举的使用方式

3.1 访问枚举项

$status = Status::Approved;

3.2 比较(全类型安全)

if ($status === Status::Approved) {
    // ...
}

3.3 获取 Backed Enum 的值

echo Role::Admin->value; // "admin"

3.4 从值反查枚举项(Backed Enum 专用)

$role = Role::from('admin'); // Role::Admin

⚠️ from() 若失败会抛异常,tryFrom() 返回 null

$role = Role::tryFrom('unknown'); // null


4. Enum 可添加方法

enum Status {
    case Pending;
    case Approved;
    case Rejected;

    public function isFinal(): bool {
        return $this === self::Rejected || $this === self::Approved;
    }
}

使用:

if ($status->isFinal()) {
    // ...
}


5. Enum + match 实战

$result = match($status) {
    Status::Pending  => '待处理',
    Status::Approved => '已通过',
    Status::Rejected => '已拒绝',
};


6. Enum 实现接口

interface Label {
    public function label(): string;
}

enum Status: string implements Label {
    case Pending = 'pending';
    case Approved = 'approved';

    public function label(): string {
        return match($this) {
            self::Pending  => '待处理',
            self::Approved => '已通过',
        };
    }
}


7. 枚举中使用注解(Attributes)

#[Attribute]
class Color {
    public function __construct(public string $hex) {}
}

enum Tag {
    #[Color('#f00')] case Error;
    #[Color('#0f0')] case Success;
}


8. 获取所有枚举项:cases()

所有枚举都内置 cases() 方法,用于获取所有 case:

Status::cases();

示例输出:

[
    Status::Pending,
    Status::Approved,
    Status::Rejected,
]

典型用途:

foreach (Status::cases() as $case) {
    echo $case->name;
}


9. 枚举项名称:name 属性

枚举项自带 name 属性(字符串):

echo Status::Pending->name; // "Pending"

适用于:

  • 日志
  • 数据展示
  • 动态配置


10. Backed Enum 的 value 属性

仅 Backed Enum 有:

echo Role::Admin->value; // "admin"

典型场景:

  • 数据库存储
  • 接口传输
  • 配置驱动逻辑

总结

PHP Enum 提供:

功能 Pure Enum Backed Enum
case ...
cases()
$case->name
$case->value
from() / tryFrom()

Enum 能显著提升代码可读性、类型安全性,减少魔法字符串,是 PHP 8.1+ 推荐实践。

php
本作品采用《CC 协议》,转载必须注明作者和本文链接
啪嗒啪嗒啪嗒 (`・ω・´)つ_▃ <?php echo "PHP is the best language in the world!"; ?>
slowlyo
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!