該項目的維護由 Tidelift 提供支援。
首先,也是最重要的一點, SplEnum
沒有整合到 PHP 中,您必須單獨安裝擴充功能。
使用枚舉代替類別常數具有以下優點:
您可以使用枚舉作為參數類型: function setAction(Action $action) {
您可以使用枚舉作為傳回類型: function getAction() : Action {
您可以使用方法來豐富枚舉(例如format
、 parse
等)
您可以擴展枚舉以添加新值(使您的枚舉final
以防止它)
您可以獲得所有可能值的清單(請參閱下文)
這個 Enum 類別並不是要取代類別常數,而是只在有意義時才使用。
composer require myclabs/php-enum
use MyCLabsEnumEnum;/** * Action 枚舉 * * @extends Enum<Action::*> */final class Action extends Enum {private const VIEW = '查看';private const EDIT = '編輯'; }
$action = Action::VIEW();// 或使用動態鍵:$action = Action::$key();// 或使用動態值:$action = Action::from($value);/ / 或$action = new Action($value);
如您所見,靜態方法會自動實作以提供對枚舉值的快速存取。
與使用類別常數相比,一個優點是能夠使用枚舉作為參數類型:
函數 setAction(Action $action) {// ...}
__construct()
建構子檢查枚舉中是否存在該值
__toString()
您可以echo $myValue
,它將顯示枚舉值(常數的值)
getValue()
傳回枚舉的當前值
getKey()
傳回 Enum 上目前值的鍵
equals()
測試枚舉實例是否相等(如果枚舉值相等則傳回true
,否則false
)
靜態方法:
from()
建立一個 Enum 實例,檢查該值是否存在於枚舉中
toArray()
方法 以陣列形式傳回所有可能的值(鍵中的常數名稱,值中的常數值)
keys()
傳回 Enum 類別中所有常數的名稱(鍵)
values()
傳回所有 Enum 常數的 Enum 類別實例(鍵中的常數名稱,值中的 Enum 實例)
isValid()
檢查測試值在枚舉集上是否有效
isValidKey()
檢查測試的金鑰在枚舉集上是否有效
assertValidValue()
斷言該值在枚舉集上有效,否則拋出異常
search()
傳回搜尋值的鍵
最終類別 Action 擴展了 Enum {private const VIEW = '查看';private const EDIT = '編輯'; }// 靜態方法:$action = Action::VIEW();$action = Action::EDIT();
靜態方法助手是使用__callStatic()
實作的。
如果您關心 IDE 自動完成,您可以自行實作靜態方法:
最終類別 Action 擴展了 Enum {private const VIEW = 'view';/** * @return Action */public static function VIEW() {return new Action(self::VIEW); } }
或者您可以使用 phpdoc (例如 PhpStorm 支援):
/** * @method static Action VIEW() * @method static Action EDIT() */final class Action extends Enum {private const VIEW = '查看';private const EDIT = '編輯'; }
PHP 8.1 版本中引進了原生枚舉:https://www.php.net/enumerations
如果您的專案運行 PHP 8.1+ 或您的程式庫將其作為最低要求,您應該使用它而不是此程式庫。
從myclabs/php-enum
遷移時,如果按照建議的方式使用,那麼工作量應該很小:
私有常數
最後的課程
沒有方法被覆蓋
遷移的變化:
類別定義應從
/** * @method static Action VIEW() * @method static Action EDIT() */final class Action extends Enum {private const VIEW = '查看';private const EDIT = '編輯'; }
到
枚舉運算: string{case VIEW = 'view';case EDIT = 'edit'; }
所有使用類別作為類型的地方都將繼續工作。
用法和所需的更改:
手術 | myclabs/php-enum | 本機列舉 |
---|---|---|
取得實例將從 | $enumCase = Action::VIEW() | $enumCase = Action::VIEW |
從支援值建立枚舉 | $enumCase = new Action('view') | $enumCase = Action::from('view') |
取得枚舉實例的支援值 | $enumCase->getValue() | $enumCase->value |
比較兩個枚舉實例 | $enumCase1 == $enumCase2 或者 $enumCase1->equals($enumCase2) | $enumCase1 === $enumCase2 |
取得枚舉實例的鍵/名稱 | $enumCase->getKey() | $enumCase->name |
取得枚舉所有可能實例的列表 | Action::values() | Action::cases() |
取得按名稱映射的枚舉的可能實例的映射 | Action::values() | array_combine(array_map(fn($case) => $case->name, Action::cases()), Action::cases()) 或者 (new ReflectionEnum(Action::class))->getConstants() |
取得枚舉所有可能名稱的列表 | Action::keys() | array_map(fn($case) => $case->name, Action::cases()) |
取得枚舉所有可能支援值的列表 | Action::toArray() | array_map(fn($case) => $case->value, Action::cases()) |
取得按名稱映射的枚舉的可能支援值的映射 | Action::toArray() | array_combine(array_map(fn($case) => $case->name, Action::cases()), array_map(fn($case) => $case->value, Action::cases())) 或者 array_map(fn($case) => $case->value, (new ReflectionEnum(Action::class))->getConstants())) |
PHP 8.1+ 本機枚舉
學說枚舉映射
Symfony ParamConverter 集成
PHPStan 集成