PHP8.1版本及其以上的枚举增强类应用

342 阅读4分钟

项目地址:github.com/lishuncoder…

安装

composer require lishun/enums  

简述

提供两种枚举的应用,一种是对常规枚举类的加强和扩展,即枚举类扩展,继承原枚举类原生功能的基础上拓展了注解属性,出发点源自于一些枚举的值确实一致但意义却不一样的场景:

tb_user.gender:  
0 未知  
1 男  
2 女  
  
tb_user.type:  
0 普通  
1 特殊类型1  
2 特殊类型2  
  

此时值确实一致,但需要的解释和描述却完全不一致,这是通过 const 常量的注解已经无法实现这个功能,或者只能将原 const 值 变为数组,这并不优雅,这时通过对无值枚举类的注解,可以实现值一致,并且附带其余解释和分组与多重分组功能。

另一种是对业务中常见的错误码进行收纳和管理,并且提供前缀功能。让错误码几乎不可能出现重复,并且抛出时变的更加简单。

枚举类扩展

use Lishun\Enums\Annotations\EnumCase;  
use Lishun\Enums\Interfaces\EnumCaseInterface;  
use Lishun\Enums\Traits\EnumCaseGet;  
  
/**  
* @method getTest()  
*/  
enum DemoEnum implements EnumCaseInterface  
{  
use EnumCaseGet;  
  
#[EnumCase(msg: '系统错误', data: 1, group: 'sys', ext: ['test'=>1,'type'=>2])]  
case SYSTEM_ERROR;  
  
#[EnumCase(msg: '系统错误2', data: 2, group: ['sys', 'sys2'])]  
case SYSTEM_ERROR2;  
  
#[EnumCase('系统错误3', 2)]  
case SYSTEM_ERROR3;  
}  
  

枚举函数

获取枚举解释信息

  
// 获取解释信息  
DemoEnum::SYSTEM_ERROR->getMsg(); // msg:系统错误  
  

获取枚举拓展数据

  
// 获取枚举拓展数据  
DemoEnum::SYSTEM_ERROR->getExt(); // ext: ['test'=>1,'type'=>2]  
  

获取枚举拓展数据的某个值

  
// 获取枚举拓展数据的某个值  
DemoEnum::SYSTEM_ERROR->getExt('test'); // 1  
  
// 这个方法需要你在原类上加上注释 @method getTest()  
DemoEnum::SYSTEM_ERROR->getTest(); // 1  
  
// 这个方法需要你在原类上加上注释 @method test()  
DemoEnum::SYSTEM_ERROR->test(); // 1  
  

获取枚举注解数据

// 获取枚举注解数据  
DemoEnum::SYSTEM_ERROR->getData();  
  

获取枚举分组名

// 获取枚举附属数据  
DemoEnum::SYSTEM_ERROR->getGroup();  
  

获取枚举的分组数据

  
// 获取枚举分组,将返回一个数组,如果传入值为单个的情况仅返回单个分组,传入值为数组的情况下会返回以分组名为key的多维数组  
DemoEnum::getGroupEnums('sys');  
DemoEnum::getGroupEnums(['sys','sys2']);  
DemoEnum::getGroupEnums(DemoEnum::SYSTEM_ERROR->getGroup())  
  
//数据结构如下:  
DemoEnum::getGroupEnums('sys');  
{  
"SYSTEM_ERROR": {  
"name": "SYSTEM_ERROR",  
"value": null,  
"msg": "系统错误",  
"data": 1,  
"group": "sys",  
"ext": [  
1,  
2,  
3  
]  
},  
"SYSTEM_ERROR2": {  
"name": "SYSTEM_ERROR2",  
"value": null,  
"msg": "系统错误2",  
"data": 2,  
"group": [  
"sys",  
"sys2"  
],  
"ext": null  
}  
}  
  
DemoEnum::getGroupEnums(['sys','sys2']);  
"sys": {  
"SYSTEM_ERROR": {  
"name": "SYSTEM_ERROR",  
"value": null,  
"msg": "系统错误",  
"data": 1,  
"group": "sys",  
"ext": [  
1,  
2,  
3  
]  
},  
"SYSTEM_ERROR2": {  
"name": "SYSTEM_ERROR2",  
"value": null,  
"msg": "系统错误2",  
"data": 2,  
"group": [  
"sys",  
"sys2"  
],  
"ext": null  
}  
},  
"sys2": {  
"SYSTEM_ERROR2": {  
"name": "SYSTEM_ERROR2",  
"value": null,  
"msg": "系统错误2",  
"data": 2,  
"group": [  
"sys",  
"sys2"  
],  
"ext": null  
}  
}  
  
  

将枚举转换为数组

  
// 将枚举转换为数组  
DemoEnum::SYSTEM_ERROR2->toArray();  
{  
"name": "SYSTEM_ERROR2",  
"value": null,  
"msg": "系统错误2",  
"data": 2,  
"group": [  
"sys",  
"sys2"  
],  
"ext": null  
}  
  

错误码

  
use Lishun\Enums\Annotations\EnumCode;  
use Lishun\Enums\Annotations\EnumCodePrefix;  
use Lishun\Enums\Interfaces\EnumCodeInterface;  
use Lishun\Enums\Traits\EnumCodeGet;  
  
#[EnumCodePrefix(10, '系统错误码')]  
enum DemoCode: int implements EnumCodeInterface  
{  
use EnumCodeGet;  
  
// 错误码: 10500, 错误信息: 系统错误  
#[EnumCode('系统错误')]  
case SYSTEM_ERROR = 500;  
  
  
#[EnumCode(msg:'系统错误1')]  
case SYSTEM_ERROR1 = 501;  
  
#[EnumCode(msg:'系统错误2',ext:['test'=1])]  
case SYSTEM_ERROR2 = 502;  
}  

获取错误码

  
// 获取错误码  
DemoCode::SYSTEM_ERROR->getCode(); // 10500  
  

获取错误码解释

  
// 获取错误码解释  
DemoCode::SYSTEM_ERROR->getMsg(); // 系统错误  
  

获取错误码前缀

  
// 获取错误码前缀  
DemoCode::SYSTEM_ERROR->getPrefixCode(); // 10  
  

获取错误码前缀注释

  
// 获取错误码前缀注释  
DemoCode::SYSTEM_ERROR->getPrefixMsg(); // 系统错误码  

获取枚举拓展数据的某个值

// 获取枚举拓展数据的某个值  
DemoCode::SYSTEM_ERROR->getExt('test'); // 1  
  
// 这个方法需要你在原类上加上注释 @method getTest()  
DemoCode::SYSTEM_ERROR->getTest(); // 1  
  
// 这个方法需要你在原类上加上注释 @method test()  
DemoCode::SYSTEM_ERROR->test(); // 1  

将错误码转换为数组

  
// 将枚举转换为数组  
DemoEnum::SYSTEM_ERROR2->toArray();  
{  
"name": "SYSTEM_ERROR",  
"value": 500,  
"msg": "系统错误",  
"code": 10500,  
"ext": null,  
"pre": {  
"prefixCode": 10,  
"prefixMsg": "系统错误码"  
}  
}  
  
  

抛出错误码时

  
// 将枚举转换为数组  
throw new BusinessException(DemoCode::SYSTEM_ERROR);  
  
// 通过接口判断是否为code的实现类  
class BusinessException extends ServerException  
{  
public function __construct(mixed $message = null,mixed $code = 0, Throwable $previous = null)  
{  
if ($message instanceof EnumCodeInterface) {  
$msg = $message->getMsg();  
$code = $message->getCode();  
parent::__construct($msg, $code, $previous);  
}else{  
parent::__construct($message, $code, $previous);  
}  
}  
}  
  
  

鸣谢