PHP的Enum(枚举)的实现

原文地址:http://www.cnblogs.com/zsxfbj/p/php_enum.html

PHP其实有Enum类库的,需要安装perl扩展,所以不是php的标准扩展,因此代码的实现需要运行的php环境支持。

(1)扩展类库SplEnum类。该类的摘要如下:

?


1

2

3

4

5

6

7

8

SplEnum 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

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 <[email protected]&gt

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

22

class 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

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"

  

时间: 2024-10-14 10:32:38

PHP的Enum(枚举)的实现的相关文章

java之enum枚举(2015年05月28日)

背景: 今天启动了一个新的项目,由于要从之前的旧项目中拿过来一些代码,所以就看了下公司之前项目代码,发现有定义的常量类,也有枚举类,然后就在想着两者的功能差不多,那他们之间到底有什么区别呢,所以就决定了解下enum枚举   一.简介 Java 中的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型. 二.基本用法 1.作为常量使用 一个完整的枚举类型示例 /** * 枚举 * @author Dreyer * @since 1.0 * @dat

enum枚举类型的定义

enum枚举类型的定义方式与某种用法 #include <iostream> using namespace std; int main() { enum TOT{ zero, one, two, three, four, five };//0,1,2,3,4,5 TOT to1; to1 = five; switch (to1) { case 0:cout << "zero\n"; break; case 1:cout << "one\n

中秋佳节--理解Enum枚举

一.Enum枚举的作用 1.使用枚举可以限定取值范围,枚举中定义的每个常量都可以理解为对象: Eg: Public enum Color{ RED, GREEN,BULE; } 说明:RED实际上就表示的是枚举的名称,默认的编号是0,可以使用ordinal()方法获得. 2.使用enum关键字定义枚举类,其中包含的对象可以初始化定义(初始化构造函数) Eg: package cn.test.java.enums; enum ColorDemo{ RED("红色"),GREEN(&quo

C语言——enum枚举类型

enum是枚举类型,实际上就是定义一组值,enum定义数据类型的值只能是这一组值中的一个. 在实际生活中,很多问题都与是这样的.如人的性别,只有男女两种:一星期有七天:月份只有十二个值. 如下定义一周七天的值: #include <stdio.h> typedef enum { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }week; int main() { printf("%d %d %d %d %

开发中巧用Enum枚举类型

在实际开发中,在数据库表设计中,我们往往习惯于用一个Int类型的State字段去表示数据的状态,这个字段很方便去表示这条数据的状态,但是又不愿意去建一张这个State字段的外键表去解释状态.(这一类型表状态的字段可能还会有很多,这里只是举个例)   我们一般会把这个State字段当成一个约定,去在项目中应用(比如:0:启用,1:禁用) 在后台管理或其它地方显示Int类型对应的实际状态时,再到公共类中去写一个方法,里面用一个switch...case去返回对应的中文解释. http://www.d

Java Enum枚举

1.代码 import java.lang.*; // enum showing Mobile prices enum Mobile { Samsung(400), Nokia(250),Motorola(325); int price; Mobile(int p) { price = p; } int showPrice() { return price; } } public class EnumDemo { public static void main(String args[]) {

获取Enum枚举值描述的几法方法

原文:获取Enum枚举值描述的几法方法 1.定义枚举时直接用中文 由于VS对中文支持的很不错,所以很多程序员都采用了此方案. 缺点:1.不适合多语言 2.感觉不太完美,毕竟大部分程序员大部分代码都使用英文 2.利用自定义属性定义枚举值的描述(博客园-大尾巴狼) 缺点:不适合多语言 原文:http://www.cnblogs.com/hilite/archive/2006/03/28/360793.html 枚举定义: [EnumDescription("订单.订单中的产品.产品项的状态.&quo

Java多线程编程6--单例模式与多线程--使用静态内置类、(反)序列化、static代码块、enum枚举数据类实现

前面讲的用DCL可以解决多线程单例模式的非线程安全,虽然看下去十分完美,但还是有一些问题,具体分析看这篇:http://blog.csdn.net/ochangwen/article/details/51348078 当然用其他的办法也能达到同样的效果. 1.使用静态内置类实现单例模式 public class Singleton { /* 私有构造方法,防止被实例化 */ private Singleton() { } /* 此处使用一个内部类来维护单例 */ private static c

Enum枚举类|注解Annotation

Enum枚举类 ①枚举类和普通类的区别: 使用 enum 定义的枚举类默认继承了 java.lang.Enum 类 枚举类的构造器只能使用 private 访问控制符 枚举类的所有实例必须在枚举类中显式列出(, 分隔    ; 结尾). 列出的实例系统会自动添加 public static final 修饰 ②JDK 1.5 中可以在 switch 表达式中使用Enum定义的枚举类的对象作为表达式, case 子句可以直接使用枚举值的名字, 无需添加枚举类作为限定 ③枚举类的主要方法: valu

Java enum 枚举还可以这么用

在大部分编程语言中,枚举类型都会是一种常用而又必不可少的数据类型,Java中当然也不会例外.然而,Java中的Enum枚举类型却有着许多你意想不到的用法,下面让我们一起来看看. 1.可以在enum中添加变量和方法 先来看一段代码示例: public enum State { Normal("正常态", 1), Update("已更新", 2), Deleted("已删除", 3), Fired("已屏蔽", 4); // 成员