php 8.1 引入的枚举类型(enum)通过 enum 关键字定义,支持纯枚举(仅常量)和带值枚举(backed enum),能替代传统的类常量或字符串标识符。使用它时,只需声明枚举名、成员及可选的值,并通过 ::>member_name 语法访问,既保证了类型安全又提供了丰富的内置方法如 cases() 和 from()/tryfrom()。

如何定义并访问枚举成员?
定义枚举需使用 enum 关键字,成员默认是纯常量形式,若需关联具体值则需实现 BackedEnum 接口。访问成员直接使用双冒号操作符,例如 Status::Active,这比字符串更直观且受 IDE 支持。

<?php enum Status {
case Pending;
case Active;
case Inactive;
}
echo Status::Pending->name; // 输出: Pending
echo Status::Pending->value; // 报错: Backed enum does not have a value
上述代码展示了纯枚举的定义与访问。尝试访问 value 属性会抛出错误,因为该枚举未绑定后备值。这种结构适合仅需区分状态而不需要持久化值的场景。
如何使用后备值进行序列化与反序列化?
当需要将枚举映射到数据库整数或字符串时,应使用后备枚举(Backed Enum)。在定义时为每个成员指定标量值(int 或 string),利用 from() 方法根据值获取枚举实例,或用 tryFrom() 安全处理无效值。

<?php enum UserRole: int {
case Admin = 1;
case Editor = 2;
case Viewer = 3;
}
// 从值创建枚举实例
$user = UserRole::from(2);
echo $user->name; // 输出: Editor
// 安全获取,无效值返回 null
$invalid = UserRole::tryFrom(99);
echo $invalid === null ? 'Invalid' : $invalid->name;
这段代码演示了如何通过整数值 2 还原为 UserRole::Editor 对象。在实际应用中,数据库存储 2,读取后调用 from() 即可得到强类型的枚举对象,避免了魔法数字。若传入不存在的值,tryFrom() 返回 null 而非抛出异常,便于前端校验或日志记录。
如何在 switch 语句中利用枚举进行模式匹配?
枚举最强大的应用场景之一是与 match 表达式结合,实现类型安全的分支逻辑。由于枚举成员是唯一的对象实例,match 可以精确匹配 Status::Active 这样的实例,无需比较字符串或整数,从而消除拼写错误或值冲突的风险。
<?php function processStatus(Status $status): string {
return match ($status) {
Status::Pending => 'Waiting for review',
Status::Active => 'Processing now',
Status::Inactive => 'Archived',
};
}
echo processStatus(Status::Active); // 输出: Processing now
在此示例中,函数接收 Status 枚举类型参数,内部使用 match 对三个成员进行分支处理。相比传统 switch 比较字符串,这种方式在编译期就能检查完整性,若遗漏某个成员,PHP 会提示未覆盖情况。这种写法让业务逻辑清晰且不易出错,特别适合状态机或配置项的处理。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











