PHP的Enum(枚举)的实现

王朝学院·作者佚名  2016-08-28
窄屏简体版  字體: 小  |  中  |  大  |  超大  

原文地址: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&gt

* @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"

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航