該項目的維護由 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 集成