介绍
如何使用PHP来实现枚举? ?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!
枚举
在数学和计算机科学理论中,一个集的<强>枚举强>是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见,例如表示星期的周日,周一,周二,周三,周四,周五,周六就是一个枚举。——维基百科
引用>业务场景
在实际开发过程中我们非常容易接触到枚举类型,但是又因为PHP原生对枚举的支持不是太好,所以很多时候开发人员并没有重视枚举的使用,而是使用全局常量或者类常量代替,而这两个数据原则上还是<代码>字符串> 代码并不能用来做类型判断。
业务
<李>订单状态待支付/待发货/待收货/待评价李> <>李会员状态激活/未激活等等,很多时候我们都会用简单的1/2/3/4或者0/1这样的方式去代表,然后在文档或者注释中规定这些东西。李>
更高级一点儿的就是定义成常量,然后方便统一存取,但是常量的值还是是字符串,无法进行类型判断。
这里就要看一下PHP对枚举的支持,虽然PHP对枚举没有完美的支持,但是在SPL中还是有一个基础的枚举类
SPL枚举
SplEnum延伸SplType{/常量 const零__default=零;//方法 公共getConstList ((bool include_default美元=FALSE)):数组//继承的方法 SplType: __construct([混合initial_value美元[,bool严格美元]]) }但是!这个需要额外的安装PECL用PECL安装<代码> Spl_Types> 代码,无意间增加了使用成本,那有没有其他解决方案?答案是肯定的。
直接手写一个。
开始准备
首先定一个枚举
Enum类 {//默认值 const __default=self:: WAIT_PAYMENT;//待付款 const WAIT_PAYMENT=0;//待发的货 const WAIT_SHIP=1;//待收的货 const WAIT_RECEIPT=2;//待评价 const WAIT_COMMENT=3; }这样似乎就完成了,我们直接使用<代码>枚举::WAIT_PAYMENT> 代码就可以拿到里面的值了,但是传参的地方我们并没法校验他。
函数setStatus(枚举状态美元){//TODO } setStatus(枚举::WAIT_PAYMENT);//错误显然这是不行的因为上面常量的值时一个int并不是Enum类型。这里我们就需要用到PHP面向对象中的一个魔术方法__toString ()
公共__toString(空白):字符串
__toString()方法用于一个类被当成字符串时应怎样回应。例如回声obj美元;应该显示些什么。此方法必须返回一个字符串,否则将发出一条E_RECOVERABLE_ERROR级别的致命错误。引用>现在我们来完善一下这个方法。
OrderStatus延伸Enum类 {//默认值 const __default=self:: WAIT_PAYMENT;//待付款 const WAIT_PAYMENT=0;//待发的货 const WAIT_SHIP=1;//待收的货 const WAIT_RECEIPT=2;//待评价 const WAIT_COMMENT=3; 公共函数__toString () { 返回& # 39;233 & # 39;; } }//对象 回波方法(orderStatus美元)。PHP_EOL;//布尔真 var_dump()美元orderStatus instanceof Enum);//233 echo $ orderStatus;<强>初具模型强>
这里似乎实现了一部分,那我们应该怎么样让他做的更好吗?再来改造一下。
orderStatus延伸Enum类 {//默认值 const __default=self:: WAIT_PAYMENT;//待付款 const WAIT_PAYMENT=0;//待发的货 const WAIT_SHIP=1;//待收的货 const WAIT_RECEIPT=2;//待评价 const WAIT_COMMENT=3;/* * * @var字符串 */保护美元价值; 公共函数__construct ($ value=https://www.yisu.com/zixun/null) { 美元$ this ->价值=is_null(值)?自我::__default:美元价值; } 公共函数__toString () { 返回(string) $ this ->价值; } }//1 ? ? 美元orderStatus=new orderStatus (orderStatus:: WAIT_SHIP);//对象 回波方法(orderStatus美元)。PHP_EOL;//布尔真 var_dump()美元orderStatus instanceof Enum);//1 回声orderStatus美元。PHP_EOL;//2 ? ? 美元orderStatus=new orderStatus ();//对象 回波方法(orderStatus美元)。PHP_EOL;//布尔真 var_dump()美元orderStatus instanceof Enum);//0 echo $ orderStatus;//3 ? ? 美元orderStatus=new orderStatus(“意外的参数”);//对象 回波方法(orderStatus美元)。PHP_EOL;//布尔真 var_dump()美元orderStatus instanceof Enum);//意外的参数 echo $ orderStatus;使用PHP来实现枚举的方法