基于注解的 PHP 枚举类实现

首先,先放一下项目仓库
Enum

之前在写项目的时候,通常一个错误码对应一条文案。这就导致我们写出了这种代码

<?php
class ErrorCode{
    const ERROR=1000;
        const PARAM_ERROR = 1001;

        const MESSAGE=[
            self::ERROR=>'系统错误',
                self::PARAM_ERROR=>'参数错误',
        ];
}

随着我们的errorCode越来越多,就导致当我们拿到错误码时,我们很不容易找到他的错误信息。。而且每次新添加一个code,都要拖到最底下,添加一个message。感觉很不爽。

于是我们的ErrorCode又进行了一次升级。

<?php
class ErrorCode{
    const ERROR=1000;
        const ERROR_SHOW='系统错误';
        const PARAM_ERROR = 1001;
        const PARAM_ERROR_SHOW='参数错误';

        public static function getMessage($code){
            // 通过反射取出对应的SHOW
        }
}

这种写法刚出来,就被否决了。。没有最丑,只有更丑的设计,另外,既然都用了反射,为什么我们不把错误信息放到他的注释里呢。

于是便有了这种新的设计,还是蛮有趣的。

<?php
use Xin\Phalcon\Enum\Enum;

class ErrorCode extends Enum
{
    /**
     * @Message('非法的TOKEN')
     */
    public static $ENUM_INVALID_TOKEN = 700;
}

$code = ErrorCode::$ENUM_INVALID_TOKEN;
$message = ErrorCode::getMessage($code); // 非法的TOKEN

是不是很有趣,哈哈哈

PHP7.1以后就能反射拿到const的注释了,所以升级了一下常量组件

本作品采用《CC 协议》,转载必须注明作者和本文链接
Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
本帖由系统于 5年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 13
李铭昕

@anniversary 生命不息,折腾不止啊 :see_no_evil:

6年前 评论
Dwy

请问,如果要支持多语言该怎么做呢

6年前 评论

自定义错误不多时,还可行。如果自定义错误变得非常多时,就不适用了。个人解决方案:定义个 errorDescribe.php (例:[415=>'参数错误']) 的配置文件再定义个 errorCode (例:['param_error'=>415])

file

6年前 评论

@FreeMason 果自定义错误变得非常非常非常多时,感觉你这个也不太靠谱了。

6年前 评论

.......不算吧 顶多就是解析注释

6年前 评论

Operation failed.

6年前 评论
李铭昕

@Dwy 多语言的话,就需要你自己扩展了。。。

比如一个是@EN注解,一个@ZH,然后主动覆写getMessage,根据某个参数返回对应的文案即可

6年前 评论
李铭昕

@FreeMason 你这么做也行啊,但是如果需要加个错误码,你就要改两个地方。。

基于注解的唯一的好处,就是看起来他是个注释,但是他又是可以被代码访问到的注解。

6年前 评论
ThinkQ

:+1:

6年前 评论

这个反射会对程序有影响吗?

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!