jesseschalken / enum
不使用反射的PHP枚举
v1.0
2016-01-15 17:35 UTC
Requires (Dev)
- phpunit/phpunit: ^5.1.4
This package is not auto-updated.
Last update: 2024-09-14 18:52:57 UTC
README
为PHP 5.3+提供快速且安全的枚举,不使用反射。
目标
- 快速。检查枚举值应该是 O(1)。
- 简洁。枚举的作者应该尽可能少写代码,而不牺牲其他目标。
- 安全。具体的枚举类实例只能包含有效值。
- 不使用反射。特别是
- 不要使用
ReflectionClass
来获取类的常量列表,因为这违反了开发者的期望,即通过Class::CONSTANT
未引用的类常量是未使用的,可以被删除。 - 不要使用
__call
或__callStatic
来创建伪方法,因为这违反了开发者的期望,即无法在代码中找到的Class::method()
或$object->method()
形式的调用是错误。
- 不要使用
示例
use JesseSchalken\Enum\IntEnum; class Day extends IntEnum { const MONDAY = 0; const TUESDAY = 1; const WEDNESDAY = 2; const THURSDAY = 3; const FRIDAY = 4; const SATURDAY = 5; const SUNDAY = 6; public static function values() { return array( self::MONDAY, self::TUESDAY, self::WEDNESDAY, self::THURSDAY, self::FRIDAY, self::SATURDAY, self::SUNDAY, ); } } function needs_day(Day $d) { if ($d->value() == Day::FRIDAY) { print "It's Friday, Friday..."; } } Day::check(Day::TUESDAY); // okay Day::check(2); // okay Day::check(7); // throws EnumException Day::valid(Day::SUNDAY); // true Day::valid('foo'); // false $day = new Day(Day::MONDAY); needs_day($day);
use JesseSchalken\Enum\StringEnum; class Color extends StringEnum { const RED = 'red'; const ORANGE = 'orange'; const YELLOW = 'yellow'; const GREEN = 'green'; const BLUE = 'blue'; const PURPLE = 'purple'; public static function values() { return array( self::RED, self::ORANGE, self::YELLOW, self::GREEN, self::BLUE, self::PURPLE, ); } } function needs_color(Color $c) { switch ($c->value()) { case Color::RED: print 'is red'; break; //... } } $color = new Color(Color::RED); needs_color($color);