基于注解的 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年前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《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年前 评论

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