基于注解的 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 协议》,转载必须注明作者和本文链接
本帖由系统于 5年前 自动加精
真能造啊
@anniversary 生命不息,折腾不止啊 :see_no_evil:
请问,如果要支持多语言该怎么做呢
自定义错误不多时,还可行。如果自定义错误变得非常多时,就不适用了。个人解决方案:定义个 errorDescribe.php (例:[415=>'参数错误']) 的配置文件再定义个 errorCode (例:['param_error'=>415])
@FreeMason 果自定义错误变得非常非常非常多时,感觉你这个也不太靠谱了。
@freewill 怎么说
.......不算吧 顶多就是解析注释
Operation failed.
@Dwy 多语言的话,就需要你自己扩展了。。。
比如一个是@EN注解,一个@ZH,然后主动覆写getMessage,根据某个参数返回对应的文案即可
@FreeMason 你这么做也行啊,但是如果需要加个错误码,你就要改两个地方。。
基于注解的唯一的好处,就是看起来他是个注释,但是他又是可以被代码访问到的注解。
:+1:
这个反射会对程序有影响吗?