PHP 枚举

前面的文章中我们介绍了PHP枚举的使用,最近对项目整体进行重构,增加了枚举类的封闭性和安全性,尤其对多值枚举进行了优化。

枚举类

PHPEnum包含三个核心枚举类,分别为:

基础枚举 – 测试用例 这是一个单值枚举类,也是一个基础类,枚举类都会继承此类

列表枚举 – 测试用例 这是一个基于单值枚举类实现的多值枚举类,可以定义任意数量的属性

数组枚举 – 测试用例 这是一个多值枚举的实现类,基于最常用的两个属性值的枚举场景预定义了key和value两个属性

这里所说的单值和多值的值是指属性值,其实枚举本身没有单值和多值之分,但由于语言特性,没有很好的办法将其在一个类中实现。

快速开始

让我们通过一个表示用户性别的枚举为例,来了解各个枚举的用法和区别

数组枚举

定义数组枚举时需要注意所有的常量值都需要定义为有两个元素的数组,否则系统将会抛出一个异常

首先我们基于数组枚举来定义用户性别枚举,它的定义方式与普通的常量定义一样:

class UserGenderEnum extends PhpEnumArrayEnum {

const MALE = [1, 'male'];

const FEMALE = [2, 'female'];

}

当我们定义好用户性别枚举后,让我们看看数组枚举为我们提供了哪些功能:

当我们想获取一个男性的枚举实例时,我们可以通过下面任意一个方法,获取到的枚举实例始终为同一个

UserGenderEnum::MALE() // 只会缓存当前实例

UserGenderEnum::ofEnumName('MALE') // 会缓存所有实例

UserGenderEnum::ofKey(1) // 会缓存所有实例

UserGenderEnum::ofValue('male') // 会缓存所有实例

当我们想获取枚举名称或属性值时,我们可以这样做

UserGenderEnum::MALE()->name() // string(4) "MALE"

UserGenderEnum::MALE()->getKey() // int(1)

UserGenderEnum::MALE()->getValue() // string(4) "male"

当我们想比较一个属性时,我们可以这样做

UserGenderEnum::MALE()->enumNameEquals('MALE') // bool(true)

UserGenderEnum::MALE()->keyEquals(1) // bool(true)

UserGenderEnum::MALE()->valueEquals('male') // bool(true)

当我们想要验证前端传递的数据是否正确时,枚举可以很快速的实现它

UserGenderEnum::containsEnumName('MALE') // int(1) 返回查找到的枚举数量

UserGenderEnum::containsKey(1) // int(1) 返回查找到的枚举数量

UserGenderEnum::containsValue('male') // int(1) 返回查找到的枚举数量

可能有的时候我们无法得到一个具体的值去验证,比如在Laravel验证器中,我们需要得到一个字符串进行验证,只需要这么做

implode(',', UserGenderEnum::names()) // string(11) "MALE,FEMALE"

implode(',', UserGenderEnum::getProperties('key')) // string(3) "1,2"

implode(',', UserGenderEnum::getProperties('value')) // string(11) "male,female"

通过上面的示例我们了解到了数组枚举部分功能的用法,但你可能觉得预定义的属性名称key和value

在不同的场景下对理解它们代表什么含义并不友好,那么接下来你需要了解下列表枚举的使用。

列表枚举

定义列表枚举时需要注意必须要定义protected修饰的构造方法listEnumConstruct,枚举常量值必须为非空数组且长度要与构造方法参数的个数完全一致,否则系统将会抛出一个异常

这次让我们基于列表枚举来定义用户性别枚举, 这次除了定义常量外,我们使用了自定义的属性名称id和name,并通过构造方法为其赋值

class UserGenderEnum extends PhpEnumListEnum {

const MALE = [1, 'male'];

const FEMALE = [2, 'female'];

private $id;

private $name;

protected function listEnumConstruct($id, $name)

{

$this->id = $id;

$this->name = $name;

}

}

当我们定义好用户性别枚举后,上面我们在数组枚举中演示过的功能在这里也全都生效,只是需要将key换成id,将value换成name,如:

当我们想获取一个男性的枚举实例时,我们可以通过下面任意一个方法,获取到的枚举实例始终为同一个。

UserGenderEnum::MALE() // 只会缓存当前实例

UserGenderEnum::ofEnumName('MALE') // 会缓存所有实例

UserGenderEnum::ofId(1) // 会缓存所有实例

UserGenderEnum::ofName('male') // 会缓存所有实例

当我们想获取枚举名称或属性值时,我们可以这样做

UserGenderEnum::MALE()->name() // string(4) "MALE"

UserGenderEnum::MALE()->getId() // int(1)

UserGenderEnum::MALE()->getName() // string(4) "male"

当我们想比较一个属性时,我们可以这样做

UserGenderEnum::MALE()->enumNameEquals('MALE') // bool(true)

UserGenderEnum::MALE()->idEquals(1) // bool(true)

UserGenderEnum::MALE()->nameEquals('male') // bool(true)

当我们想要验证前端传递的数据是否正确时,枚举可以很快速的实现它

UserGenderEnum::containsEnumName('MALE') // int(1) 返回查找到的枚举数量

UserGenderEnum::containsId(1) // int(1) 返回查找到的枚举数量

UserGenderEnum::containsName('male') // int(1) 返回查找到的枚举数量

可能有的时候我们无法得到一个具体的值去验证,比如在Laravel验证器中,我们需要得到一个字符串进行验证,只需要这么做

implode(',', UserGenderEnum::names()) // string(11) "MALE,FEMALE"

implode(',', UserGenderEnum::getProperties('id')) // string(3) "1,2"

implode(',', UserGenderEnum::getProperties('name')) // string(11) "male,female"

列表枚举的实现多是参考JAVA枚举,但由于JAVA本身是在语言层面对枚举功能做的支持,定义JAVA枚举元素就是在定义构造方法,这些在PHP中无法支持,所以只能用数组来代替。

基础枚举

基础枚举是单值枚举,只有属性名称name和属性值value,基础枚举不限制属性值的类型,但同时属性值始终作为一个整体,无法再细分

这次让我们再基于基础枚举来定义用户性别枚举,基础枚举的定义同数组枚举的定义相同

class UserGenderEnum extends PhpEnumEnum {

const MALE = [1, 'male'];

const FEMALE = [2, 'female'];

}

当我们定义好用户性别枚举后,让我们看看基础枚举为我们提供了哪些功能(注意基础枚举中的属性值[1, ‘male’]只能作为一个整体使用):

当我们想获取一个男性的枚举实例时,我们可以通过下面任意一个方法,获取到的枚举实例始终为同一个

UserGenderEnum::MALE() // 只会缓存当前实例

UserGenderEnum::ofEnumName('MALE') // 会缓存所有实例

UserGenderEnum::ofEnumValue([1, 'male']) // 会缓存所有实例

当我们想获取枚举名称或属性值时,我们可以这样做

UserGenderEnum::MALE()->name() // string(4) "MALE"

UserGenderEnum::MALE()->value() // array(2) {[0]=>int(1)[1]=>string(4) "male"}

当我们想比较一个属性时,我们可以这样做

UserGenderEnum::MALE()->enumNameEquals('MALE') // bool(true)

UserGenderEnum::MALE()->enumValueEquals([1, 'male']) // bool(true)

当我们想要验证前端传递的数据是否正确时,枚举可以很快速的实现它

UserGenderEnum::containsEnumName('MALE') // int(1) 返回查找到的枚举数量

UserGenderEnum::containsValue([1, 'male']') // int(1) 返回查找到的枚举数量

当我们需要得到一个字符串时,可以这样做

implode(',', UserGenderEnum::names()) // string(11) "MALE,FEMALE"

到这里枚举常用的功能就介绍完了,三种不同类型的枚举提供不同的功能,要根据实际的使用场景进行选择使用

程序员灯塔

转载请注明原文链接:PHP中实现多值枚举

php子域枚举,PHP中实现多值枚举相关推荐

  1. python中字典的键是唯一的吗_python 零散记录(四) 强调字典中的键值唯一性 字典的一些常用方法...

    dict中键只有在值和类型完全相同的时候才视为一个键: mydict = {1:1,'':1} #此时mydict[1] 与 mydict['1']是两个不同的键值 dict的一些常用方法: clea ...

  2. JAVA项目中枚举和字典表,2020-01-31 关于枚举与数据字典

    说说什么时候使用了枚举: 框架中,使用了枚举类的注解,即数据持久化时使用注解,当参数为枚举时,存入库的信息为枚举上注解的值 数据字典: 数据字典是我们在数据库中建的表,基本包含组,key , valu ...

  3. 男 女 java 枚举_献给我老公 - Java枚举类型

    枚举类型是一种特殊的数据类型.具有枚举类型的变量,其取值范围会被限定在预定义的常量池中.该变量的值必须为预定义取值的其中之一.常见的例子有指南针的方向(东,西,南,北)和星期几. 由于是常量,枚举类型 ...

  4. Python枚举是什么-读懂Python枚举的方法

    enum 是一组绑定到唯一常数值的符号名称,并且具备可迭代性和可比较性的特性.我们可以使用 enum 创建具有良好定义的标识符,而不是直接使用魔法字符串或整数,也便于开发工程师的代码维护. 创建枚举 ...

  5. 如何从Java中的字符串值获取枚举值?

    说我有一个枚举 public enum Blah {A, B, C, D } 我想找到一个字符串的枚举值,例如"A"就是Blah.A 怎么可能做到这一点? Enum.valueOf ...

  6. java调用构造函数中某一个值_Java如何在枚举的构造函数中调用另一个枚举值

    Java中的枚举(enum)是一种存储一组常量值的数据类型.您可以使用枚举来存储固定值,例如一周中的天,一年中的月等. 您可以使用关键字 enum定义枚举,后跟枚举的名称为-enum Days { S ...

  7. 枚举类中获取枚举值的几种方法

    在开发的过程中我们经常会定义枚举类,枚举类中获取枚举值的方式也有很多种,下面我们就探究一下大家常用的几种方式: 枚举类 public enum TestEnum {ONE(1,"one&qu ...

  8. java在枚举方法中调方法_java – 值方法如何在枚举中工作

    在Enum中value()方法如何工作? values()方法背后的逻辑是什么? 在我的项目中,我们将所有枚举数据缓存在Map中,如下所示: public enum Actions { CREATE( ...

  9. JS基础 -- 枚举对象中的属性

    /** 什么事枚举对象中的属性?* 下面以一个例子来慢慢解释*///创建一个对象var obj = {name: '唐一彩',age: 4000,gender: '男',address: '白马寺'} ...

最新文章

  1. cgi、fastcgi、php-cgi、php-fpm的关系
  2. 企业dns 服务器的搭建
  3. Visitor(访问者)模式在SAP CDS view测试框架中的灵活运用
  4. 面试官:Spring创建好的单例对象存在线程安全问题吗?
  5. 寻找设计独特标识LOGO的灵感?可编辑模板帮你轻松解决!
  6. xml文件中若没有子节点,则删除文件
  7. 腾讯十年经验总结分享!软件测试经典面试题!你招架的住吗?
  8. 关于minigui的皮肤控件无法显示问题
  9. nec的reset文件摘要
  10. 【2022最新版】Java零基础入门教程_零基础学Java_Java入门教程
  11. 【PHP练习】每日词汇,随机产生10个单词,方便备考随时背诵(php+html+css)
  12. 青岛地区服务器不稳定怎么办,青岛联通现大面积DNS故障 用户该如何上网
  13. 滴滴云部署 Hadoop2.7.7+Hive2.3.4
  14. 大数据在各领域应用之销量预测
  15. 英文论文写作相关实用网站与工具整理
  16. 嘀嗒出行的IPO备战
  17. mongoDB1: 安装与基础操作
  18. 【ANSYS Sherlock学习记录】Part 1、导入ODB文件
  19. [C++] [MinGW] MinGW下载与使用
  20. java复习思维导图

热门文章

  1. 计算机音乐作曲排名2019,2019金曲排行榜_2019《全球华人歌曲排行榜》年度五强名单公布...
  2. java model 中文乱码_Java解压zip 解决编码和中文乱码问题
  3. php range第二个参数比第一个小,鲜为人知的 PHP range() 函数
  4. php怎么爬取亚马逊的数据,使用PHP从Amazon MWS API获取订单数据
  5. β射线与哪些物质可产生较高的韧致辐射_辐射防护试题库(无评分标准)
  6. 文件上传 java web_JavaWeb 文件上传下载
  7. Ubuntu下使用GDB断点Go程序
  8. mysql给数据做排名_mysql给数据统计做排名
  9. redis 集群搭建_Redis分布式缓存分布式集群搭建
  10. 计算机基础知识考试模拟试题,计算机基础知识模拟试题及答案