PHP中没有struct、enum这些东西,虽然万能的array用起来很爽,但写出来的代码typo问题很多、可维护性也差,需要更多的测试来辅助,而一旦加上测试的工作量是否还谈得上『爽』就是个问号了。

看了一篇研究Java enum机制的文章,文章里提到java的具体的enum其实就是一个类,重点是它的每一个枚举值也是一个enum对象。

对照着用PHP初步实现了一下。PHP的__callStatic 不支持静态属性访问,所以暂时用静态方法的形式访问枚举值 (string) Color::RED()。

<?php

interface enum
{ } /**
* @method enum RED() Description
*/
final class Color implements enum
{
private static $enums =
[
'RED' => [255, 0, 0],
'BLUE' => [0, 0, 255],
'BLACK' => [0, 0, 0],
'YELLOW' => [255, 255, 0],
'GREEN' => [0, 255, 0]
];
private static $objs = []; private $name; public static function __callStatic($name, $arguments)
{
if (!array_key_exists($name, static::$enums)) {
throw new Exception('enum not existed', -1);
} return static::valueOf($name);
} private function setName($val): void
{
$this->name = $val;
} private static function initEnum(string $name): bool
{
if (isset(static::$objs[$name])) {
return true;
} if (!array_key_exists($name, static::$enums)) {
throw new Exception('enum not existed', -1);
} $obj = new Color();
$obj->setName($name); static::$objs[$name] = $obj; return true;
} public static function values(): array
{
if (empty(static::$objs)) {
foreach (array_keys(static::$enums) as $name) {
static::initEnum($name);
}
} return static::$objs;
} public static function valueOf(string $name): enum
{
if (!array_key_exists($name, static::$enums)) {
throw new Exception('enum not existed', -1);
} static::initEnum($name); return static::$objs[$name];
} public function ordinal(): int
{
//TODO
return 0;
} /**
* @throws ClassCastException
*/
public function compareTo(enum $other): int
{
//TODO
return -1;
} public function equals(enum $other): bool
{
//TODO
return true;
} public function __toString()
{
if (!$this->name) {
return '';
} return '(' . implode(',', static::$enums[$this->name]) . ')';
}
} echo (string) Color::RED();
echo (string) Color::valueOf('BLACK');

代码并没有做细致的抽象,如果要进一步抽象的话,可以试试定义一个EnumTraits来包含那些公共方法。

会不会有人问,既然你这么喜欢Java的enum,为什么不直接用Java得了。

对于PHP中enum的好奇的更多相关文章

  1. MYSQL中 ENUM 类型

    MYSQL中 ENUM 类型的详细解释 ENUM类型 ENUM 是一个字符串对象,其值通常选自一个允许值列表中,该列表在表创建时的列规格说明中被明确地列举. 在下列某些情况下,值也可以是空串(&quo ...

  2. mysql中enum的用法

    字段 类型 长度/值*1 整理 属性 Null 默认2 额外 注释 enum         说明:enum类型的字段,若长度值写长度1/2,报错 (1)  数据长度为1,则为0,1,2… (2)   ...

  3. JAVA中enum的常见用法

    JAVA中enum的常见用法包括:定义并添加方法.switch.遍历.EnumSet.EnumMap 1.定义enum并添加或覆盖方法 public Interface Behaviour{ void ...

  4. Java中enum的学习总结

    一.通常的定义常量的方法 public class Sex{ public final static int MALE = 1; public final static int FEMALE=2; } ...

  5. MVC图片上传详解 IIS (安装SSL证书后) 实现 HTTP 自动跳转到 HTTPS C#中Enum用法小结 表达式目录树 “村长”教你测试用例 引用provinces.js的三级联动

    MVC图片上传详解   MVC图片上传--控制器方法 新建一个控制器命名为File,定义一个Img方法 [HttpPost]public ActionResult Img(HttpPostedFile ...

  6. 关于python中Enum的个人总结

    关于python中Enum的个人总结 初识 可以通过enum模块导入 语法 初始化: 可以通过enum_ = Enum('class_name', names,start = 1)来创建,其中name ...

  7. (转C#中Enum用法小结)

    enums枚举是值类型,数据直接存储在栈中,而不是使用引用和真实数据的隔离方式来存储. (1)默认情况下,枚举中的第一个变量被赋值为0,其他的变量的值按定义的顺序来递增(0,12,3...),因此以下 ...

  8. C#中enum类型

    最近碰到了枚举类型,就顺便整理下. 枚举的基类Enum,可以是除 Char 外的任何整型.不做显示声明的话,默认是整形(Int32). 声明一个Enum类型: /// <summary> ...

  9. c#中enum的用法小结

    转自:http://blog.csdn.net/moxiaomomo/article/details/8056356 enums枚举是值类型,数据直接存储在栈中,而不是使用引用和真实数据的隔离方式来存 ...

随机推荐

  1. jquery获取radio值

    单选组radio: $("input[@type=radio][@checked]").val(); 单选组 radio: $("input[@type=radio]&q ...

  2. 增量式pid和位置式PID参数整定过程对比

    //增量式PID float IncPIDCalc(PID_Typedef* PIDx,float SetValue,float MeaValue)//err»ý·Ö·ÖÀë³£Êý { PIDx-& ...

  3. (面试题)如何查找Oracle数据库中的重复记录

    今天做了个面试题:查找Oracle数据库中的重复记录,下面详细介绍其他方法(参考其他资料) 本文介绍了几种快速查找ORACLE数据库中的重复记录的方法. 下面以表table_name为例,介绍三种不同 ...

  4. 基于tornado的爬虫并发问题

    tornado中的coroutine是python中真正意义上的协程,与python3中的asyncio几乎是完全一样的,而且两者之间的future是可以相互转换的,tornado中有与asyncio ...

  5. Python常见问题系列

    Python基础题1.冒泡排序 def mao_pao(li): for i in range(len(li)): for j in range(len(li)): if li[i] < li[ ...

  6. Linux重启命令与如何重启网络?

    分享下Linux重启命令的用法,linux如何重启网络的方法? 第一部分,有关Linux重启命令的用法 1.shutdown2.poweroff3.init4.reboot5.halt *---具体说 ...

  7. Atitit 大龄软件工程师的出路attilax总结

    Atitit 大龄软件工程师的出路attilax总结 1.1. 创业vs打工 联合创始人 合伙人1 1.2. 项目管理 架构师1 1.3. 软件培训 讲师2 1.4. 研究院研究员2 1.5. 继续博 ...

  8. 【Unity】6.2 在VS2015中调试 C# 脚本

    分类:Unity.C#.VS2015 创建日期:2016-04-16 一.简介 这一节先利用GUI显示一个简单的界面(以后还会专门介绍GUI),并解释如何在VS2015中调试C#脚本. 本节例子的运行 ...

  9. vue.js 首屏优化

    我们以 vue-cli 工具为例,使用 vue-router 搭建SPA应用,UI框架选用 element-ui , ajax方案选用 axios, 并引入 vuex ,使用 vuex-router- ...

  10. angular学习笔记(三十)-指令(1)-概述

    之前在 angular学习笔记(十九)-指令修改dom 里面已经简单的提到了angular中的指令,现在来详细的介绍 '指令' 一.指令的创建: dirAppModule.directive('dir ...