PHP 8.2 新增 BackedEnum,支持标量底层值绑定、from()/tryFrom() 方法、JSON 序列化优化及 UnitEnum/BackedEnum 接口分层。

PHP 8.1 引入了基础枚举(Pure Enum),而 PHP 8.2 在其基础上增加了 BackedEnum 支持,并强化了类型系统集成与实用能力。升级后,枚举类的核心变更集中在底层值绑定、转换能力、序列化支持和接口规范四个方面。
支持标量底层值(int/string)
PHP 8.1 的枚举是“纯对象型”,每个 case 是唯一实例,不带可映射的标量值;PHP 8.2 允许显式声明底层类型,让枚举成员直接关联一个 int 或 string 值:
- PHP 8.1(仅 Pure Enum):
enum Status { case Pending; case Active; }—— 无法获取字符串或数字表示 - PHP 8.2(BackedEnum):
enum Status:string { case Pending = 'pending'; case Active = 'active'; }—— 可通过$s->value获取'pending'
新增 from() 和 tryFrom() 静态方法
BackedEnum 自动获得两个关键工厂方法,用于从外部数据(如数据库字段、HTTP 参数)安全构造枚举实例:
-
Status::from('pending'):成功返回Status::Pending,失败抛出ValueError -
Status::tryFrom('unknown'):失败时返回null,适合宽松校验场景 - 这两个方法在 PHP 8.1 中不存在,必须手动实现映射逻辑
原生支持 JSON 序列化与反序列化
PHP 8.2 的 BackedEnum 实例默认不具备自动 JSON 转换能力,但因具备 ->value 属性,配合 JsonSerializable 接口可简洁统一处理:
立即学习“PHP免费学习笔记(深入)”;
- 只需在枚举中定义
jsonSerialize()方法,返回$this->value即可 - 对比 PHP 8.1:若用纯枚举 + JSON,需额外包装或手动转义,否则
json_encode()输出空对象或报错 - 数据库读写也更自然:字段存
'pending',直接Status::from($row['status'])转换
接口继承关系明确化
PHP 8.2 显式区分两类枚举的基接口,增强类型提示和 IDE 支持:
- Pure Enum(PHP 8.1 引入)→ 自动实现
UnitEnum接口 - BackedEnum(PHP 8.2 新增)→ 同时实现
UnitEnum和BackedEnum接口 - 可通过类型约束限定参数必须为 backed 枚举:
function handle(Status|string $v): void→ 更精准



















