不使用反射的PHP枚举

v1.0 2016-01-15 17:35 UTC

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);