PHP的Enum(枚举)的实现
转载请保留原文地址:http://www.cnblogs.com/zsxfbj/p/php_enum.html
PHP其实有Enum类库的,需要安装perl扩展,所以不是php的标准扩展,因此代码的实现需要运行的php环境支持。
(1)扩展类库SplEnum类。该类的摘要如下:
SplEnum extends SplType {
/* Constants */
const NULL __default = null ;
/* 方法 */
public array getConstList ([ bool $include_default = false ] )
/* 继承的方法 */
SplType::__construct ([ mixed $initial_value [, bool $strict ]] )
}
使用示例:
<?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;
}
?>
输出结果:
6
Value not a const in enum Month
(2)自定义的Enum类库
摘自http://www.php4every1.com/scripts/php-enum/
<?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
*/
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);
}
}
使用示例如下:
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());
}
输出结果如下:
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"
PHP的Enum(枚举)的实现的更多相关文章
- c# (ENUM)枚举组合类型的谷歌序列化Protobuf
c# (ENUM)枚举组合类型的谷歌序列化Protobuf,必须在序列化/反序列化时加上下面: RuntimeTypeModel.Default[typeof(Alarm)].EnumPassthru ...
- C#将Enum枚举映射到文本字符串
介绍 当将以前的C代码移植到C#中时,我快发疯了,因为有很多的数组需要将常量映射到字符串.当我在寻找一个C#的方法来完成的时候,我发现了一个自定义属性和映射的方法. 如何使用代码? 对每一个enum枚 ...
- MVC3不能正确识别JSON中的Enum枚举值
一.背景 在MVC3项目里,如果Action的参数中有Enum枚举作为对象属性的话,使用POST方法提交过来的JSON数据中的枚举值却无法正确被识别对应的枚举值. 二.Demo演示 为了说明问题,我使 ...
- 161208、Java enum 枚举还可以这么用
在大部分编程语言中,枚举类型都会是一种常用而又必不可少的数据类型,Java中当然也不会例外.然而,Java中的Enum枚举类型却有着许多你意想不到的用法,下面让我们一起来看看. 先来看一段代码示例: ...
- Python中模拟enum枚举类型的5种方法分享
这篇文章主要介绍了Python中模拟enum枚举类型的5种方法分享,本文直接给出实现代码,需要的朋友可以参考下 以下几种方法来模拟enum:(感觉方法一简单实用) 复制代码代码如下: # way1 ...
- java之enum枚举(2015年05月28日)
背景: 今天启动了一个新的项目,由于要从之前的旧项目中拿过来一些代码,所以就看了下公司之前项目代码,发现有定义的常量类,也有枚举类,然后就在想着两者的功能差不多,那他们之间到底有什么区别呢,所以就决定 ...
- 1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组
一.程序 现实生活中,程序是指完成某些事务的一种既定方法和过程,可以把程序看成是一系列动作执行过程的描述. 在计算机世界,程序是指令,即为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集 ...
- Enum枚举类|注解Annotation
Enum枚举类 ①枚举类和普通类的差别: 使用 enum 定义的枚举类默认继承了 java.lang.Enum 类 枚举类的构造器仅仅能使用 private 訪问控制符 枚举类的全部实例必须在枚举类中 ...
- 中秋佳节--理解Enum枚举
一.Enum枚举的作用 1.使用枚举可以限定取值范围,枚举中定义的每个常量都可以理解为对象: Eg: Public enum Color{ RED, GREEN,BULE; } 说明:RED实际上就表 ...
- 获取Enum枚举值描述的几法方法
原文:获取Enum枚举值描述的几法方法 1.定义枚举时直接用中文 由于VS对中文支持的很不错,所以很多程序员都采用了此方案. 缺点:1.不适合多语言 2.感觉不太完美,毕竟大部分程序员大部分代码都使用 ...
随机推荐
- python基础之socket编程(二)
ssh远程执行命令: 思路分析: 客户端给服务端发送命令,服务端返回一个输出结果传给客户端. #coding:utf-8 #买手机 import socket import struct import ...
- ViewGroup的事件分发机制
我们用手指去触摸Android手机屏幕,就会产生一个触摸事件,但是这个触摸事件在底层是怎么分发的呢?这个我还真不知道,这里涉及到操作硬件 (手机屏幕)方面的知识,也就是Linux内核方面的知识,我也没 ...
- L144
Puny Dwarf Planet, Named 'Goblin,' Found Far Beyond PlutoA scrawny dwarf planet nicknamed "the ...
- Hihocoder 1128 二分·二分查找
二分·二分查找 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Nettle最近在玩<艦これ>,因此Nettle收集了很多很多的船(这里我们假设Nettle氪 ...
- bzoj 3173 最长上升子序列
Written with StackEdit. Description 给定一个序列,初始为空.现在我们将\(1\)到\(N\)的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字, ...
- mysql8之与标准sql的区别
一 mysql8概述 在研究mysql8新特性的时候,越来越感觉mysql8朝sql server看齐.看来对于中小型企业级应用也挺有兴趣,但是没有企业级的应用套件,有知道的麻烦告知.本文不探讨my ...
- spring的笔记1 关云长
1.1 实例化方式 l 3种bean实例化方式:默认构造.静态工厂.实例工厂 1.1.1 默认构造 <bean id="" class=""> ...
- hexo配置主题发表文章
将本地hexo博客部署到github上了,如果想换我们自己喜欢的主题(默认为landscape),同时也要发表发表文章呢,下面给介绍下: 1,进入hexo官网,预览自己想要的主题,https://gi ...
- 【java规则引擎】java规则引擎搭建开发环境
Drools官网:http://www.jboss.org/drools Drools and jBPM consist out of several projects:(Drools软件包提供的几个 ...
- VS 2015 开发Android底部导航条----[实例代码,多图]
1.废话背景介绍 在Build 2016开发者大会上,微软宣布,Xamarin将被整合进所有版本的Visual Studio之中. 这也就是说,Xamarin将免费提供给所有购买了Visual ...