当前位置:首页 > PHP教程 > php应用 > 列表

PHP中Enum(枚举)用法实例详解

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-29 09:53:29 浏览: 评论:0 

这篇文章主要介绍了PHP中Enum(枚举)用法,结合实例形式较为详细的分析了php中Enum(枚举)的实现与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下。

本文实例讲述了PHP中Enum(枚举)用法。分享给大家供大家参考,具体如下:

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

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

  1. SplEnum extends SplType { 
  2. /* Constants */ 
  3. const NULL __default = null ; 
  4. /* 方法 */ 
  5. public array getConstList ([ bool $include_default = false ] ) 
  6. /* 继承的方法 */ 
  7. SplType::__construct ([ mixed $initial_value [, bool $strict ]] ) 

使用示例:

  1. <?php 
  2. class Month extends SplEnum { 
  3.   const __default = self::January; 
  4.   const January = 1; 
  5.   const February = 2; 
  6.   const March = 3; 
  7.   const April = 4; 
  8.   const May = 5; 
  9.   const June = 6; 
  10.   const July = 7; 
  11.   const August = 8; 
  12.   const September = 9; 
  13.   const October = 10; 
  14.   const November = 11; 
  15.   const December = 12; 
  16. echo new Month(Month::June) . PHP_EOL; 
  17. try { 
  18.   new Month(13); 
  19. } catch (UnexpectedValueException $uve) { 
  20.   echo $uve->getMessage() . PHP_EOL; 
  21. ?> 

输出结果:

Value not a const in enum Month

(2)自定义的Enum类库

  1. <?php 
  2. /** 
  3.  * Abstract class that enables creation of PHP enums. All you 
  4.  * have to do is extend this class and define some constants. 
  5.  * Enum is an object with value from on of those constants 
  6.  * (or from on of superclass if any). There is also 
  7.  * __default constat that enables you creation of object 
  8.  * without passing enum value. 
  9.  * 
  10.  * @author Marijan Šuflaj <msufflaj32@gmail.com&gt 
  11.  * @link http://php4every1.com 
  12.  */ 
  13. abstract class Enum { 
  14.   /** 
  15.    * Constant with default value for creating enum object 
  16.    */ 
  17.   const __default = null; 
  18.   private $value
  19.   private $strict
  20.   private static $constants = array(); 
  21.   /** 
  22.    * Returns list of all defined constants in enum class. 
  23.    * Constants value are enum values. 
  24.    * 
  25.    * @param bool $includeDefault If true, default value is included into return 
  26.    * @return array Array with constant values 
  27.    */ 
  28.   public function getConstList($includeDefault = false) { 
  29.     $class = get_class($this); 
  30.     if (!array_key_exists($class, self::$constants)) { 
  31.       self::populateConstants(); 
  32.     } 
  33.     return $includeDefault ? array_merge(self::$constants[__CLASS_], array
  34.       "__default" => self::__default 
  35.     )) : self::$constants[__CLASS_]; 
  36.   } 
  37.   /** 
  38.    * Creates new enum object. If child class overrides __construct(), 
  39.    * it is required to call parent::__construct() in order for this 
  40.    * class to work as expected. 
  41.    * 
  42.    * @param mixed $initialValue Any value that is exists in defined constants 
  43.    * @param bool $strict If set to true, type and value must be equal 
  44.    * @throws UnexpectedValueException If value is not valid enum value 
  45.    */ 
  46.   public function __construct($initialValue = null, $strict = true) { 
  47.     $class = get_class($this); 
  48.     if (!array_key_exists($class, self::$constants)) { 
  49.       self::populateConstants(); 
  50.     } 
  51.     if ($initialValue === null) { 
  52.       $initialValue = self::$constants[$class]["__default"]; 
  53.     } 
  54.     $temp = self::$constants[$class]; 
  55.     if (!in_array($initialValue$temp$strict)) { 
  56.       throw new UnexpectedValueException("Value is not in enum " . $class); 
  57.     } 
  58.     $this->value = $initialValue
  59.     $this->strict = $strict
  60.   } 
  61.   private function populateConstants() { 
  62.     $class = get_class($this); 
  63.     $r = new ReflectionClass($class); 
  64.     $constants = $r->getConstants(); 
  65.     self::$constants = array
  66.       $class => $constants 
  67.     ); 
  68.   } 
  69.   /** 
  70.    * Returns string representation of an enum. Defaults to 
  71.    * value casted to string. 
  72.    * 
  73.    * @return string String representation of this enum's value 
  74.    */ 
  75.   public function __toString() { 
  76.     return (string) $this->value; 
  77.   } 
  78.   /** 
  79.    * Checks if two enums are equal. Only value is checked, not class type also. 
  80.    * If enum was created with $strict = true, then strict comparison applies 
  81.    * here also. 
  82.    * 
  83.    * @return bool True if enums are equal 
  84.    */ 
  85.   public function equals($object) { 
  86.     if (!($object instanceof Enum)) { 
  87.       return false; 
  88.     } 
  89.     return $this->strict ? ($this->value === $object->value) 
  90.       : ($this->value == $object->value); 
  91.   } 

使用示例如下:

  1. class MyEnum extends Enum { 
  2.   const HI = "Hi"
  3.   const BY = "By"
  4.   const NUMBER = 1; 
  5.   const __default = self::BY; 
  6. var_dump(new MyEnum(MyEnum::HI)); 
  7. var_dump(new MyEnum(MyEnum::BY)); 
  8. //Use __default 
  9. var_dump(new MyEnum()); 
  10. try { 
  11.   new MyEnum("I don't exist"); 
  12. } catch (UnexpectedValueException $e) { 
  13.   var_dump($e->getMessage()); 

输出结果如下:

  1. object(MyEnum)#1 (2) { 
  2.  ["value":"Enum":private]=> 
  3.  string(2) "Hi" 
  4.  ["strict":"Enum":private]=> 
  5.  bool(true) 
  6. object(MyEnum)#1 (2) { 
  7.  ["value":"Enum":private]=> 
  8.  string(2) "By" 
  9.  ["strict":"Enum":private]=> 
  10.  bool(true) 
  11. object(MyEnum)#1 (2) { 
  12.  ["value":"Enum":private]=> 
  13.  string(2) "By" 
  14.  ["strict":"Enum":private]=> 
  15.  bool(true) 
  16. string(27) "Value is not in enum MyEnum" 

希望本文所述对大家PHP程序设计有所帮助。

Tags: Enum PHP枚举

分享到: