原文地址:http://www.cnblogs.com/zsxfbj/p/php_enum.html
PHP其实有Enum类库的,需要安装perl扩展,所以不是php的标准扩展,因此代码的实现需要运行的php环境支持。
(1)扩展类库SplEnum类。该类的摘要如下:
?
1
2
3
4
5
6
7
8
SplEnumextendsSplType {
/* Constants */
constNULL __default = null ;
/* 方法 */
publicarraygetConstList ([ bool$include_default= false ] )
/* 继承的方法 */
SplType::__construct ([ mixed$initial_value[, bool$strict]] )
}
使用示例:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
classMonthextendsSplEnum {
const__default = self::January;
constJanuary = 1;
constFebruary = 2;
constMarch = 3;
constAPRil = 4;
constMay = 5;
constJune = 6;
constJuly = 7;
constAugust = 8;
constSeptember = 9;
constOctober = 10;
constNovember = 11;
constDecember = 12;
}
echonewMonth(Month::June) . PHP_EOL;
try{
newMonth(13);
}catch(UnexpectedValueException$uve) {
echo$uve->getMessage() . PHP_EOL;
}
?>
输出结果:
?
1
2
6
Value not a const in enum Month
(2)自定义的Enum类库
摘自http://www.php4every1.com/scripts/php-enum/
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<?php
/**
* Abstract class that enables creation of PHP enums. All you
* have to do is extend this class and define some constants.
* Enum is an object with value from on of those constants
* (or from on of superclass if any). There is also
* __default constat that enables you creation of object
* without passing enum value.
*
* @author Marijan Šuflaj <msufflaj32@Gmail.com>
* @link http://php4every1.com
*/
abstractclassEnum {
/**
* Constant with default value for creating enum object
*/
const__default = null;
private$value;
private$strict;
privatestatic$constants=array();
/**
* Returns list of all defined constants in enum class.
* Constants value are enum values.
*
* @param bool $includeDefault If true, default value is included into return
* @return array Array with constant values
*/
publicfunctiongetConstList($includeDefault= false) {
$class= get_class($this);
if(!array_key_exists($class, self::$constants)) {
self::populateConstants();
}
return$includeDefault?array_merge(self::$constants[__CLASS_],array(
"__default"=> self::__default
)) : self::$constants[__CLASS_];
}
/**
* Creates new enum object. If child class overrides __construct(),
* it is required to call parent::__construct() in order for this
* class to work as expected.
*
* @param mixed $initialValue Any value that is exists in defined constants
* @param bool $strict If set to true, type and value must be equal
* @throws UnexpectedValueException If value is not valid enum value
*/
publicfunction__construct($initialValue= null,$strict= true) {
$class= get_class($this);
if(!array_key_exists($class, self::$constants)) {
self::populateConstants();
}
if($initialValue=== null) {
$initialValue= self::$constants[$class]["__default"];
}
$temp= self::$constants[$class];
if(!in_array($initialValue,$temp,$strict)) {
thrownewUnexpectedValueException("Value is not in enum ".$class);
}
$this->value =$initialValue;
$this->strict =$strict;
}
privatefunctionpopulateConstants() {
$class= get_class($this);
$r=newReflectionClass($class);
$constants=$r->getConstants();
self::$constants=array(
$class=>$constants
);
}
/**
* Returns string representation of an enum. Defaults to
* value casted to string.
*
* @return string String representation of this enum's value
*/
publicfunction__toString() {
return(string)$this->value;
}
/**
* Checks if two enums are equal. Only value is checked, not class type also.
* If enum was created with $strict = true, then strict comparison applies
* here also.
*
* @return bool True if enums are equal
*/
publicfunctionequals($object) {
if(!($objectinstanceofEnum)) {
returnfalse;
}
return$this->strict ? ($this->value ===$object->value)
: ($this->value ==$object->value);
}
}
使用示例如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
classMyEnumextendsEnum {
constHI ="Hi";
constBY ="By";
constNUMBER = 1;
const__default = self::BY;
}
var_dump(newMyEnum(MyEnum::HI));
var_dump(newMyEnum(MyEnum::BY));
//Use __default
var_dump(newMyEnum());
try{
newMyEnum("I don't exist");
}catch(UnexpectedValueException$e) {
var_dump($e->getMessage());
}
输出结果如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
object(MyEnum)#1 (2) {
["value":"Enum":private]=>
string(2) "Hi"
["strict":"Enum":private]=>
bool(true)
}
object(MyEnum)#1 (2) {
["value":"Enum":private]=>
string(2) "By"
["strict":"Enum":private]=>
bool(true)
}
object(MyEnum)#1 (2) {
["value":"Enum":private]=>
string(2) "By"
["strict":"Enum":private]=>
bool(true)
}
string(27) "Value is not in enum MyEnum"