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

PHP技术
287
0
0
2023-08-22
标签   PHP8

安装

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);
        }
    }
}

鸣谢