问题

我经常在不同的地方使用模型中的常量(基本状态常量),当常量改变时我不得不在使用每处它的代码中修改。

获取常量

为了解决这个问题我使用了一个方法 getConstants().

public static function getConstants($token,$objectClass) {
$tokenLen = strlen($token); $reflection = new ReflectionClass($objectClass); //php built-in
$allConstants = $reflection->getConstants(); //constants as array $tokenConstants = array();
foreach($allConstants as $name => $val) {
if ( substr($name,0,$tokenLen) != $token ) continue;
$tokenConstants[ $val ] = $val;
} return $tokenConstants;
}

用法示例

为了给每个 ActiveRecord 类添加此方法,我们可以写个基类

class ActiveRecord extends CActiveRecord {

    /*
Get class constants by token.
If you set constants with same prefix, like:
MY_STATUS_1
MY_STATUS_2
MY_STATUS_3 , you can get it by calling
Class::getConstants('MY');
or
Class::getConstants('MY_STATUS');
*/
public static function getConstants($token,$objectClass) {
$tokenLen = strlen($token); $reflection = new ReflectionClass($objectClass); //php built-in
$allConstants = $reflection->getConstants(); //constants as array $tokenConstants = array();
foreach($allConstants as $name => $val) {
if ( substr($name,0,$tokenLen) != $token ) continue;
$tokenConstants[ $val ] = $val;
}
return $tokenConstants;
} }

然后所有的模型类都继承此类而不是 CActiveRecord

class Media extends ActiveRecord {
const TYPE_MUSIC = 'music';
const TYPE_VIDEO = 'video';
const TYPE_DOC = 'document'; const STATUS_ACTIVE = 'active';
const STATUS_REMOVED = 'removed'; //...
}

在模型规则,方法,或模型外使用 self::getConstants()

class Media extends ActiveRecord {
//..
public function rules()
{
return array(
array('type', 'in','range' => self::getConstants('TYPE_',__CLASS__)),
);
}
//..
public static function getStatuses() {
return self::getConstants('STATUS_',__CLASS__);
}
public static function getTypes() {
return self::getConstants('TYPE_',__CLASS__);
} }

其他地方

print_r( Media::getConstants('STATUS_','Media') );
//or create Media method and use simplified
print_r( Media::getStatuses() );

小结

当然如果你的模型中只有两个常量你可以不使用它,但当你的模型中有大量常量时建议你使用。

链接

本文翻译自外文网站,查看原文请点击:http://www.yiiframework.com/wiki/288/managing-constants-easily/

转:Yii 常量的轻松管理的更多相关文章

  1. TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端

    目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP部分的使用 框架源码结构 补充说明 源码地址 说明 之前有好几篇博客在讲TCP/UDP通信方 ...

  2. 【转】TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端

    [转]TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端).UDP客户端 目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP ...

  3. owner:轻松管理java项目配置

    前段时间,一同事说在 github 上“活捉了”一个很有趣的开源项目,它是一个超轻量级的 jar 包,能够帮助你在 java 项目中摒弃样板式的 properties 配置代码,让你轻松自如地管理和使 ...

  4. Linux任务调度命令(轻松管理Linux)

    Linux任务调度其实就是让系统在某个时间执行某些命令或者程序,这样可以让管理员更加轻松地管理自己的Linux,当我刚了解到这个方法时,我的内心充满了无尽的欣喜,感觉Linux实在是太强大了. 下面我 ...

  5. 轻松管理您的网络password

    在互联网在现在这个时代,,我们注册了很多帐户.支付宝账号password,各种宝账户password.微信,QQ,电话password,购买各种网站,金融password,它是不是让孩子们的鞋子瞬间淡 ...

  6. 最佳实践丨使用Rancher轻松管理上万资源不是梦!

    前 言 Rancher 作为一个开源的企业级 Kubernetes 集群管理平台.你可以导入现有集群,如 ACK.TKE.EKS.GKE,或者使用 RKE.RKE2.K3s 自定义部署集群. 作为业界 ...

  7. Python异步IO --- 轻松管理10k+并发连接

    前言   异步操作在计算机软硬件体系中是一个普遍概念,根源在于参与协作的各实体处理速度上有明显差异.软件开发中遇到的多数情况是CPU与IO的速度不匹配,所以异步IO存在于各种编程框架中,客户端比如浏览 ...

  8. NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64

    http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854 一 前言   当管理大量连接时,特别 ...

  9. Yii rabc角色权限管理文章推荐

    yii的这个rbac太通用,太灵活,有时候理解起来有困难.也是初学这个,推荐一个不错的文章:http://www.yiiframework.com/wiki/136/getting-to-unders ...

随机推荐

  1. [Angular 2] Handling Clicks and Intervals Together with Merge

    Observable.merge allows you take two different source streams and use either one of them to make cha ...

  2. curl_setopt函数相关应用及介绍(转)

    一.要想使用curl_setopt 这个函数必须在服务器里边进行编译curl这个组件,怎么安装编译这个组件请具体到google搜索 二.curl_setopt的php帮助文档的解释 bool curl ...

  3. 配置WifiConfiguration

    public WifiConfiguration CreateWifiInfo(String SSID, String Password, int Type) { WifiConfiguration  ...

  4. PC端QQ协议解析之0825

    QQ协议0825代号解析,包括客户端发送包和服务器发送包. 主要借鉴的此篇文章,我自己也是重复造轮子. 基本信息 操作系统:windows7 QQ-Version:3643 客户端到服务器: 02:数 ...

  5. PV和并发

    几个概念 网站流量是指网站的访问量,用来描述访问网站的用户数量以及用户所浏览的网页数量等指标,常用的统计指标包括网站的独立用户数量.总用户数量(含重复访问者).网页浏览数量.每个用户的页面浏览数量.用 ...

  6. (转)java 23种设计模式

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  7. ASP.NET-FineUI开发实践-6(三)

    自动补全也算是好东西吧,我也不清楚下拉列表可以过滤为啥还有自动补全,其实自动补全用到还是通过jq获取服务端的动态数据补全.我没做动态的例子,其实好写,就不写了. 1.用到了两个js包 <scri ...

  8. css3 3D变换和动画

    3D变换和动画 建立3D空间,transform-style: preserve-3d perspective: 100px; 景深 perspective-origin:center center ...

  9. dsoframer组件详细使用(aspx.net)

    近来由于工作需要,要求实现一个office文档在线编辑器 关于在线操作office 我是一点经验没有 网上查了半天资料 锁定了一款组件(ActiveX控件dsoframer,一个用C++实现的offi ...

  10. Android中滑动关闭Activity

    继承SwipeBackActivity即可实现向右滑动删除Activity效果 点击下载所需文件