网站地图    收藏   

主页 > 后端 > php资料库 >

Yii常量的轻松管理_自学php网

来源:自学PHP网    时间:2014-12-04 22:12 作者: 阅读:

[导读] 获取常量 为了解决这个问题我使用了一个方法 getConstants() . public static function getConstants($token,$objectClass) { $tokenLen = strlen($token); $reflection = new ReflectionClass($objectClass); //php built-in $allConstan...

    获取常量

    
 

    为了解决这个问题我使用了一个方法 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() );

    小结

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

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论