decodelabs / enumerable
枚举辅助特性
v0.1.3
2024-08-21 19:00 UTC
Requires
- php: ^8.1
- decodelabs/coercion: ^0.2.9
- decodelabs/exceptional: ^0.4.5
Requires (Dev)
- decodelabs/phpstan-decodelabs: ^0.6.8
README
枚举辅助特性
Enumerable提供了一种简单的接口和特性结构,以释放PHP枚举的全部威力。
在DecodeLabs博客上获取新闻和更新。
安装
通过Composer安装
composer require decodelabs/enumerable
使用方法
Enumerable定义了一个强大的顶级枚举接口,它扩展了枚举提供的功能范围,同时将相同的功能整合到UnitEnum
和BackedEnum
类型中。
所有Enumerable枚举都实现了一个特定类型的接口,并使用相应的特性。每种形式都指定了key
、value
和label
属性的类型,其中key用作列表中的索引,label用于显示目的。
单元枚举
命名单元枚举
use DecodeLabs\Enumerable\Unit\Named; use DecodeLabs\Enumerable\Unit\NamedTrait; enum MyNamedUnitEnum implements Named { use NamedTrait; const OptionOne; const OptionTwo; const OptionThree; } MyNamedUnitEnum::OptionOne->getName(); // 'OptionOne' MyNamedUnitEnum::OptionOne->getKey(); // 'OptionOne' MyNamedUnitEnum::OptionOne->getLabel(); // 'Option One' MyNamedUnitEnum::OptionOne->getValue(); // 'OptionOne'
索引单元枚举
use DecodeLabs\Enumerable\Unit\Indexed; use DecodeLabs\Enumerable\Unit\IndexedTrait; enum MyIndexedUnitEnum implements Indexed { use IndexedTrait; const OptionOne; const OptionTwo; const OptionThree; } MyNamedUnitEnum::OptionOne->getName(); // 'OptionOne' MyNamedUnitEnum::OptionOne->getKey(); // 0 MyNamedUnitEnum::OptionOne->getLabel(); // 'Option One' MyNamedUnitEnum::OptionOne->getValue(); // 'OptionOne'
支持枚举
命名字符串支持枚举
use DecodeLabs\Enumerable\Backed\NamedString; use DecodeLabs\Enumerable\Backed\NamedStringTrait; enum MyNamedStringBackedEnum : string implements NamedString { use NamedStringTrait; const OptionOne = 'one'; const OptionTwo = 'two'; const OptionThree = 'three'; } MyNamedStringBackedEnum::OptionOne->getName(); // 'OptionOne' MyNamedStringBackedEnum::OptionOne->getKey(); // 'OptionOne' MyNamedStringBackedEnum::OptionOne->getLabel(); // 'Option One' MyNamedStringBackedEnum::OptionOne->getValue(); // 'one'
标签字符串支持枚举
use DecodeLabs\Enumerable\Backed\LabelledString; use DecodeLabs\Enumerable\Backed\LabelledStringTrait; enum MyLabelledStringBackedEnum : string implements LabelledString { use LabelledStringTrait; const OptionOne = 'one'; const OptionTwo = 'two'; const OptionThree = 'three'; } MyLabelledStringBackedEnum::OptionOne->getName(); // 'OptionOne' MyLabelledStringBackedEnum::OptionOne->getKey(); // 'OptionOne' MyLabelledStringBackedEnum::OptionOne->getLabel(); // 'one' MyLabelledStringBackedEnum::OptionOne->getValue(); // 'one'
值字符串支持枚举
use DecodeLabs\Enumerable\Backed\ValueString; use DecodeLabs\Enumerable\Backed\ValueStringTrait; enum MyValueStringBackedEnum : string implements ValueString { use ValueStringTrait; const OptionOne = 'one'; const OptionTwo = 'two'; const OptionThree = 'three'; } MyValueStringBackedEnum::OptionOne->getName(); // 'OptionOne' MyValueStringBackedEnum::OptionOne->getKey(); // 'one' MyValueStringBackedEnum::OptionOne->getLabel(); // 'Option One' MyValueStringBackedEnum::OptionOne->getValue(); // 'one'
命名整数支持枚举
use DecodeLabs\Enumerable\Backed\NamedInt; use DecodeLabs\Enumerable\Backed\NamedIntTrait; enum MyNamedIntBackedEnum : int implements NamedInt { use NamedIntTrait; const OptionOne = 1; const OptionTwo = 2; const OptionThree = 3; } MyNamedIntBackedEnum::OptionOne->getName(); // 'OptionOne' MyNamedIntBackedEnum::OptionOne->getKey(); // 'OptionOne' MyNamedIntBackedEnum::OptionOne->getLabel(); // 'Option One' MyNamedIntBackedEnum::OptionOne->getValue(); // 1
值整数支持枚举
use DecodeLabs\Enumerable\Backed\ValueInt; use DecodeLabs\Enumerable\Backed\ValueIntTrait; enum MyValueIntBackedEnum : int implements ValueInt { use ValueIntTrait; const OptionOne = 1; const OptionTwo = 2; const OptionThree = 3; } MyValueIntBackedEnum::OptionOne->getName(); // 'OptionOne' MyValueIntBackedEnum::OptionOne->getKey(); // 1 MyValueIntBackedEnum::OptionOne->getLabel(); // 'Option One' MyValueIntBackedEnum::OptionOne->getValue(); // 1
实例化
所有枚举类型都可以使用以下方法进行实例化
MyEnum::fromKey('<key>'); MyEnum::fromValue('<value>'); MyEnum::fromName('<name>'); MyEnum::fromIndex('<index>'); // or MyEnum::tryFromKey('<key>'); MyEnum::tryFromValue('<value>'); MyEnum::tryFromName('<name>'); MyEnum::tryFromIndex('<index>');
列表
Enumerable提供了三种列出案例的主要方式
// Key to label map MyEnum::getOptions() => [ '<key>' => '<label>', ]; // Key to value map MyEnum::getValues() => [ '<key>' => '<value>', ]; // Alias to cases() MyEnum::getCases() => [ '<key>' => '[MyEnum::<name>]', ];
许可
Enumerable遵循MIT许可。有关完整许可文本,请参阅LICENSE。