原文地址:http://www.cnblogs.com/zsxfbj/p/php_enum.html
PHP其實有Enum類庫的,需要安裝perl擴展,所以不是php的標准擴展,因此代碼的實現需要運行的php環境支持。
(1)擴展類庫SplEnum類。該類的摘要如下:
? 1 2 3 4 5 6 7 8SplEnum
extends
SplType {
/* Constants */
const
NULL __default = null ;
/* 方法 */
public
array
getConstList ([ 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
class
Month
extends
SplEnum {
const
__default = self::January;
const
January = 1;
const
February = 2;
const
March = 3;
const
April = 4;
const
May = 5;
const
June = 6;
const
July = 7;
const
August = 8;
const
September = 9;
const
October = 10;
const
November = 11;
const
December = 12;
}
echo
new
Month(Month::June) . PHP_EOL;
try
{
new
Month(13);
}
catch
(UnexpectedValueException
$uve
) {
echo
$uve
->getMessage() . PHP_EOL;
}
?>
輸出結果:
? 1 26
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 <[email protected]>
* @link http://php4every1.com
*/
abstract
class
Enum {
/**
* Constant with default value for creating enum object
*/
const
__default = null;
private
$value
;
private
$strict
;
private
static
$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
*/
public
function
getConstList(
$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
*/
public
function
__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
)) {
throw
new
UnexpectedValueException(
"Value is not in enum "
.
$class
);
}
$this
->value =
$initialValue
;
$this
->strict =
$strict
;
}
private
function
populateConstants() {
$class
= get_class(
$this
);
$r
=
new
ReflectionClass(
$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
*/
public
function
__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
*/
public
function
equals(
$object
) {
if
(!(
$object
instanceof
Enum)) {
return
false;
}
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 22class
MyEnum
extends
Enum {
const
HI =
"Hi"
;
const
BY =
"By"
;
const
NUMBER = 1;
const
__default = self::BY;
}
var_dump(
new
MyEnum(MyEnum::HI));
var_dump(
new
MyEnum(MyEnum::BY));
//Use __default
var_dump(
new
MyEnum());
try
{
new
MyEnum(
"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 19object(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"