Enums(枚举,PHP 8.1+)定义了一个具有固定的命名值集合的类型——这是一个期待已久的功能,为受限的选项集合(状态、角色、类型)提供类型安全,远比旧的 class 常量或魔术字符串方法更好。
纯枚举(仅命名 cases)
{
Active;
Inactive;
Pending;
}
= ::;
{}
(::);
();
纯枚举定义命名的 cases。当用作类型提示时,它保证只有有效的值——消除了传递任意字符串/整数的错误。
enum Status: string { // "backed" by string values
case Active = 'active';
case Inactive = 'inactive';
case Pending = 'pending';
}
Status::Active->value; // 'active' — the backing value
Status::from('active'); // Status::Active — convert FROM the value
Status::tryFrom('bad'); // null if invalid (instead of throwing)
Status::cases(); // [Active, Inactive, Pending] — all cases
Backed 枚举 将每个 case 与标量值(字符串或整数)关联——对于在数据库中存储或序列化很有用,使用 from()/tryFrom() 从值转换,以及 cases() 列出所有值。
enum Status: string {
case Active = 'active';
case Inactive = 'inactive';
public function label(): string { // methods on the enum
return match($this) {
Status::Active => 'Active User',
Status::Inactive => 'Inactive User',
};
}
public function isActive(): bool {
return $this === Status::Active;
}
}
Status::Active->label(); // "Active User"
枚举可以有方法(并实现接口),让您可以为每个 case 附加行为——使它们成为强大的域建模工具。
// ❌ before enums — class constants or magic strings: no type safety, typo-prone
class Status { const ACTIVE = 'active'; const INACTIVE = 'inactive'; }
function setStatus(string $s) {} // accepts ANY string — "actve" typo compiles fine
枚举(PHP 8.1+)是一个重要的、期待已久的功能,为受限的值集合提供了适当的类型安全——随着现代 PHP 代码库的采用,理解它们变得越来越重要。
在枚举之前,开发人员使用 class 常量或原始字符串/整数来表示固定的选项集合(状态、角色、类型、状态),这提供了没有类型安全(任何字符串都被接受,所以像 "actve" 这样的笔误会通过编译并在运行时导致错误)和没有约束有效值的方法。
枚举解决了这个问题:作为一个类型提示,枚举保证只能传递有效的 cases,在类型级别而不是运行时错误上捕获无效值——这是一个重大的安全改进。Backed 枚举(带有标量值)与数据库和序列化集成良好(from()/tryFrom() 用于转换),枚举可以有方法(为每个 case 附加行为,例如 label() 或 isActive()),使它们成为域建模的强大工具。
理解纯枚举与 backed 枚举、它们的方法,以及它们如何替代容易出错的旧的常量/字符串方法,是编写现代、类型安全的 PHP 的重要知识——因为枚举现在是对固定值集合进行建模的习惯用法,广泛用于当前的框架和应用中,掌握它们体现了对现代 PHP 的流利理解和编写更安全、更具表现力、自文档化代码的能力,防止了整个类别的无效值错误。