markbaker / enumhelper
一个小型库,为PHP 8.1的枚举提供辅助特性
Requires
- php: ^8.1
Requires (Dev)
- dealerdirect/phpcodesniffer-composer-installer: ^0.7.0
- phpcompatibility/php-compatibility: ^9.0
- phpunit/phpunit: ^9.5||^10.0
- squizlabs/php_codesniffer: ^3.4
This package is auto-updated.
Last update: 2024-09-20 23:39:02 UTC
README
此包提供了一系列特性,允许您
-
RestorableFromName 特性
从名称字符串创建/恢复PHP 8.1枚举。
-
EnumValidatableCase
验证从名称字符串的枚举名称。
-
CasesIndexedByName
类似于标准的静态
cases()
方法,但返回一个关联数组,按名称索引。
安装
您可以通过composer安装此包
composer require markbaker/enumhelper
使用方法
RestorableFromName 特性
在PHP 8.1中,您可以使用枚举的from()
或tryFrom()
方法从值创建一个枚举。
enum Suit: string { case Hearts = 'H'; case Diamonds = 'D'; case Clubs = 'C'; case Spades = 'S'; } $suit = Suit::Diamonds; $value = $suit->value; // Returns 'D' $newSuit = Suit::from($value);
此库中提供的EnumHelper\EnumRestorableFromName
特性为任何枚举添加了一个fromName()
方法,您可以从名称而不是值创建枚举。
enum Suit: string { use EnumHelper\EnumRestorableFromName; case Hearts = 'H'; case Diamonds = 'D'; case Clubs = 'C'; case Spades = 'S'; } $suit = Suit::Diamonds; $suitName = $suit->name; // Returns 'Diamonds' $newSuit = Suit::fromName($suitName);
无效的名称将抛出异常。注意名称是区分大小写的。
如果您希望将名称存储在数据库中以供阅读(尤其是对于未支持的枚举),然后在加载数据库记录时在模型中重新创建枚举,这可能会很有用。
这与支持和不支持的枚举都兼容。
EnumValidatableCase 特性
用于验证枚举的案例集中是否已定义名称
enum Suit: string { use EnumHelper\EnumValidatableCase; case Hearts = 'H'; case Diamonds = 'D'; case Clubs = 'C'; case Spades = 'S'; } $suit = Suit::Diamonds; $validCaseName = Suit::Hearts; $isCaseNameValid = Suit::isValidCase($validCaseName); // Returns boolean true $invalidCaseName = 'HeArTs'; $isCaseNameValid = Suit::isValidCase($invalidCaseName); // Returns boolean false
注意名称是区分大小写的。
这与支持和不支持的枚举都兼容。
CasesIndexedByName 特性
虽然PHP 8.1+的枚举已经提供了标准的静态cases()
方法,用于返回为该枚举定义的所有案例的列表
enum Suit: string { use EnumHelper\EnumValidatableCase; case Hearts = 'H'; case Diamonds = 'D'; case Clubs = 'C'; case Spades = 'S'; } var_dump(Suit::cases());
它返回一个定义的案例的枚举数组。
array(4) {
[0]=>
enum(Suit::Hearts)
[1]=>
enum(Suit::Diamonds)
[2]=>
enum(Suit::Clubs)
[3]=>
enum(Suit::Spades)
}
使用CasesIndexedByName
特性和相关的casesIndexedByName()
方法
enum Suit: string { use EnumHelper\CasesIndexedByName; case Hearts = 'H'; case Diamonds = 'D'; case Clubs = 'C'; case Spades = 'S'; } var_dump(Suit::casesIndexedByName());
它将返回一个关联数组,其中定义的案例作为数组索引。
array(4) {
["Hearts"]=>
enum(Suit::Hearts)
["Diamonds"]=>
enum(Suit::Diamonds)
["Clubs"]=>
enum(Suit::Clubs)
["Spades"]=>
enum(Suit::Spades)
}
如果您要过滤cases()
列表以返回案例的子集,并且不喜欢枚举数组中数字序列的间隔,这可能会特别有用。
enum Suit: string { use EnumHelper\CasesIndexedByName; public const RED = 'Red'; public const BLACK = 'Black'; case Hearts = 'H'; case Diamonds = 'D'; case Clubs = 'C'; case Spades = 'S'; public function color(): string { return match($this) { self::Hearts, self::Diamonds => self::RED, self::Clubs, self::Spades => self::BLACK, }; } public static function red(): array { return array_filter( self::casesIndexedByName(), fn(self $suit) => $suit->color() === self::RED ); } public static function black(): array { return array_filter( self::casesIndexedByName(), fn(self $suit) => $suit->color() === self::BLACK ); } } var_dump(Suit::black());
将返回
array(2) {
["Clubs"]=>
enum(Suit::Clubs)
["Spades"]=>
enum(Suit::Spades)
}
变更日志
有关最近更改的更多信息,请参阅变更日志。
许可证
此库在MIT许可证(MIT)下发布。有关更多信息,请参阅许可证文件。