PHP Enum:1 分钟速通指南
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(带值)
只能是 string 或 int:
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+ 推荐实践。
本作品采用《CC 协议》,转载必须注明作者和本文链接

关于 LearnKu
推荐文章: