litgroup / enumerable
此包已被废弃,不再维护。未建议替代包。
PHP的可枚举类型实现。
v0.8.0
2021-01-30 20:25 UTC
Requires
- php: ^7.3 || ^8.0
Requires (Dev)
- phpunit/phpunit: ^9.5
README
库为PHP提供支持可枚举类的功能。
安装
使用composer安装
composer require litgroup/enumerable:^0.8.0
使用示例
定义
- 创建一个扩展自
Enumerable
的final
类; - 为每个值变体创建一个静态方法,该方法将创建一个值的实例。为此,您的方法必须调用
Enumerable::createEnum()
并传递值的某个索引。
注意
Enumerable
类必须是final
!- 索引可以是
string
或int
类型。
枚举定义示例
namespace Acme; use LitGroup\Enumerable\Enumerable; final class ColorEnum extends Enumerable { /** * @return self */ public static function red() { return self::createEnum('red'); } /** * @return self */ public static function green() { return self::createEnum('green'); } /** * @return self */ public static function blue() { return self::createEnum('blue'); } }
等式/身份检查
您可以在等式/身份表达式中使用可枚举值
ColorEnum::red() == ColorEnum::red() // => true ColorEnum::red() === ColorEnum::red() // => true ColorEnum::red() == ColorEnum::blue() // => false ColorEnum::red() === ColorEnum::blue() // => false
注意:可枚举作为运行时常量工作。因此,可枚举值可以在 身份 上进行检查。我们建议尽可能使用身份检查(
===
)而不是等式检查(==
)。
在switch-case语句中的使用
$color = ColorEnum::green(); switch ($color) { case ColorEnum::red(): echo "Red!\n"; break; case ColorEnum::green(): echo "Green!\n"; break; case ColorEnum::blue(): echo "Blue!\n"; break; } // "Green!" will be printed
序列化和持久化
Enumerable
作为运行时常量。可枚举类型不能被序列化。如果您需要将可枚举类型的表示存储在数据库中或通过API发送,可以使用可枚举值的索引作为表示。
$enum->getRawValue();
要从数据库或API请求中通过索引恢复可枚举类型的实例,您可以在具体的枚举类上使用静态方法getValueOf()
。
$colorIndex = getFromDatabase(/* something */); $enum = ColorEnum::getValueOf($colorIndex);
如果您需要获取可枚举类型的所有值,请在具体的枚举类上使用静态方法getValues()
。
ColorEnum::getValues(); // => Returns array of ColorEnum with index as key
可扩展性
如果需要,您的可枚举类的实例可以具有额外的行为。但是,您不能定义任何具有行为的public static
方法。公共静态方法仅用于创建值。
注意:您不能定义任何具有行为的
public static
方法。公共静态方法仅用于创建值。
示例
final class MergeRequestStatus extends Enumerable { public static function open() { return self::createEnum('open'); } public static function approved() { return self::createEnum('approved'); } public static function merged() { return self::createEnum('merged'); } public static function declined() { return self::createEnum('declined'); } /** * Returns true if status is final. * * @return bool */ public function isFinal() { return $this === self::merged() || $this === self::declined(); } }
运行测试
composer install ./tests.sh
许可证
请参阅LICENSE文件。