簡介
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
。