网站首页 > 知识剖析 正文
简介
PHP 从 8.1 开始原生支持枚举(enum),这是 PHP 向类型安全和现代语言特性迈进的重要一步。枚举可以定义一组有穷的、不可变的常量集合,常用于表示状态值、选项类型等。
基础语法
PHP 支持两种类型的枚举:
纯枚举(Pure Enum)
纯枚举没有绑定值,仅代表自身:
enum Status {
case Draft;
case Published;
case Archived;
}
使用:
$status = Status::Published;
if ($status === Status::Draft) {
echo '草稿';
}
具名枚举 / 带值枚举(Backed Enum)
带有标量值(string 或 int),可用于数据库或 API 等场景。
enum Role: string {
case Admin = 'admin';
case User = 'user';
case Guest = 'guest';
}
使用:
$role = Role::Admin;
echo $role->value; // 输出 'admin'
反查:
$role = Role::from('user'); // Role::User
$role = Role::tryFrom('unknown'); // null(安全版)
枚举常用方法和特性
- ->name:获取枚举名(如 'Admin')
- >value:获取值(仅限 Backed Enum)
- ::cases():返回所有枚举项数组
- ::from($value):根据值获取枚举,找不到报错
- ::tryFrom($value):根据值获取枚举,找不到返回 null
示例:
foreach (Role::cases() as $role) {
echo $role->name . ' => ' . $role->value . PHP_EOL;
}
枚举 vs 常量类
比较点 | 常量类 | 枚举 |
类型安全 | 无类型检查 | 类型安全 |
IDE 智能提示 | 一般 | 更好 |
可迭代性 | ::cases() | |
反向查找 | 手动维护 | from()、tryFrom() |
可扩展性 | 低 | 支持方法、trait、接口等 |
枚举中添加方法
enum Status: string {
case Draft = 'draft';
case Published = 'published';
case Archived = 'archived';
public function label(): string {
return match($this) {
self::Draft => '草稿',
self::Published => '已发布',
self::Archived => '已归档',
};
}
}
与属性注解结合
结合 PHP 8 的属性,可以为枚举项注解:
use Attribute;
#[Attribute]
class Label {
public function __construct(public string $text) {}
}
enum Status {
#[Label('草稿')]
case Draft;
#[Label('发布')]
case Published;
#[Label('归档')]
case Archived;
}
读取方式:
$ref = new ReflectionEnumUnitCase(Status::class, 'Draft');
$attrs = $ref->getAttributes(Label::class);
$label = $attrs[0]->newInstance()->text;
echo $label; // 草稿
实战用途
- 用户角色:enum Role: string { case Admin = 'admin'; ... }
- 状态管理:enum OrderStatus { case New; case Shipped; }
- 数据库映射:存储 enum->value,加载 Role::from($value)
- 表单选项:枚举生成所有选项下拉框
注意事项
- 枚举不能扩展(final),但可以实现接口、使用 trait;
- 不支持动态添加项;
- 只能用 string 或 int 作为 BackedEnum 的类型;
- 若用于持久化(如数据库),建议使用 BackedEnum。
猜你喜欢
- 2025-05-08 PHP 8新特性之Attributes(注解),你掌握了吗?
- 2025-05-08 PHP + Redis 高并发轮盘抽奖系统实现
- 2025-05-08 PHP设计模式之原型模式(php 模型)
- 2025-05-08 php8 throw 表达式使用教程(php表达式的定义)
- 06-30美国食品标签上的含义(美国食品标志)
- 06-305G 网络如何进行系统消息更新(5g系统升级)
- 06-30如何使用Bulk Product Update批量产品更新将产品信息提交给SAGE
- 06-30什么是VLAN? VLAN基本原理(什么是vlan 其作用是什么)
- 06-30隧道人员定位投屏操作说明(隧道人员定位系统)
- 06-30Grafana可视化平台面板之Gauge仪表和Bar Gauge条形仪表
- 06-30Web Components实践:如何搭建一个框架无关的AI组件库
- 06-30Dify「模板转换」节点终极指南:动态文本生成进阶技巧(附代码)Jinja2引擎解析|6大应用场景实战
- 最近发表
-
- 美国食品标签上的含义(美国食品标志)
- 5G 网络如何进行系统消息更新(5g系统升级)
- 如何使用Bulk Product Update批量产品更新将产品信息提交给SAGE
- 什么是VLAN? VLAN基本原理(什么是vlan 其作用是什么)
- 隧道人员定位投屏操作说明(隧道人员定位系统)
- Grafana可视化平台面板之Gauge仪表和Bar Gauge条形仪表
- Web Components实践:如何搭建一个框架无关的AI组件库
- Dify「模板转换」节点终极指南:动态文本生成进阶技巧(附代码)Jinja2引擎解析|6大应用场景实战
- 为警示“勇闯51区”的年轻人,美军方推特这个玩笑砸了自己的脚
- 威纶通触摸屏与西门子1200通讯符号寻址时,如何导入标签?
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)