基于注解的 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.
本帖由系统于 4年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 13
李铭昕

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

5年前 评论
Dwy

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

5年前 评论

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

file

5年前 评论

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

5年前 评论

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

5年前 评论

Operation failed.

5年前 评论
李铭昕

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

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

5年前 评论
李铭昕

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

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

5年前 评论
ThinkQ

:+1:

5年前 评论

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

1年前 评论

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