用户
 找回密码
 入住 CI 中国社区
搜索
查看: 4176|回复: 0
收起左侧

[核心代码 Core] 让你的类名和类文件支持驼峰命名法

[复制链接]
发表于 2014-8-9 12:09:20 | 显示全部楼层 |阅读模式
本帖最后由 Altair 于 2014-8-9 12:10 编辑

背景:一会写php,一会儿码oc,频繁地在驼峰命名法和下划线之间切换.真心感觉不爽!想在CI里使用驼峰命名法写类名和类文件名,想让类文件名和类名保持一致,想让加载时加载一个类名,想生成的对像名称是类名首字母小写的形式.多么简单的需要啊,但是CI本身并不支持!不过,CI可扩展性很强,支持扩展核心类.方法如下.如是,便可以在CI中自由使用驼峰命名法或者下划线命名法了.随你喜欢.当然,无论哪种,最好保持统一!
PHP复制代码
 
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
   
    /**
     *  装载器扩展.
     */

    class MY_Loader extends CI_Loader{
       
        // --------------------------------------------------------------------
       
        /**
         * 自定义加载库的方法.
         *
         * @param       string  类名.
         * @param       mixed   参数,可选.
         * @param       string  类对象的名称,可选.
         *
         *  注意:
         *    1.这个方法用于实现:默认生成的类库对象名,仅首字母小写,用于提供驼峰命名法提供更好的支持.
         *    2.系统的默认行为是:生成所有字母均小写的类库实例对象.
         *    3.如果你以前的代码,类库的命名全部使用的是下划线'_',那这个方法的行为可以与你以前的代码很好地兼容.
         *    4.如果你以前的代码中,类库的命名使用了驼峰命名法,可能兼容性上会有问题.但对于驼峰命名法,这种默认行为,会更优雅,使代码更具可行性.
         *    5.您仍然可以自己为生成的类对象指定一个名称.
         *    6.driver()方法内部使用 library()方法实现.所以,此方法可能也会影响 适配器(driver) 的加载方式.不过,如果你以前的代码中,关于适配器的命名中没有使用驼峰命名法,是可以兼容的!
         */

        public function library($library = '', $params = NULL, $objectName = NULL)
        {
            if (is_array($library))
            {
                foreach ($library as $class)
                {
                    $this->library($class, $params);
                }
               
                return;
            }
           
            if(NULL === $objectName)
            {
                $objectName = $this->lcfirstClassName($library);
            }
            parent::library($library, $params, $objectName);
        }
       
        // --------------------------------------------------------------------
       
        /**
         * 自定义加载模型类的方法.
         *
         * This function lets users load and instantiate models.
         *
         * @param       string  类名
         * @param       string  类对像的名称.
         * @param       bool    是否连接数据库.
         *
         *  注意:
         *    1.这个方法用于实现:默认生成的模型类对象名,仅首字母小写,用于提供驼峰命名法提供更好的支持.
         *    2.系统的默认行为是:生成的模型类实例对象名称与传入的类名大小写完全一致.
         *    3.如果你以前的代码,模型类的命名全部使用的是下划线'_',那这个方法的行为可以与你以前的代码很好地兼容.
         *    4.如果你以前的代码中,模型类的命名使用了驼峰命名法,可能兼容性上会有问题.但对于驼峰命名法,这种默认行为,会更优雅,使代码更具可行性.
         *    5.您仍然可以自己为生成的模型类对象指定一个名称.
         */

        public function model($model, $name = '', $db_conn = FALSE)
        {
            if (is_array($model))
            {
                foreach ($model as $babe)
                {
                    $this->model($babe);
                }
                return;
            }
           
            if('' === $name)
            {
                $name = $this->lcfirstClassName($name);
            }
           
            parent::model($model, $name, $db_conn);
        }
       
       
        // --------------------------------------------------------------------
       
         /**
         * 装载用作资源的类.
         *
         * 注意:
         * 1. 用作资源的类,文件应放在 application/libraries/resources 目录下.
         * 2. 默认类对象名仅首字母小写.
         *
         *  @param  string  类名.
         *  @param  mixed   参数,可选.
         *  @param  string  实例对象名,可选.
         *
         *  @return void;
         */

        public function resource($resource = '', $params = NULL, $objectName = NULL)
        {
            /* 可能用户想同时加载多个资源. */
            if (is_array($resource))
            {
                foreach ($resource as $class)
                {
                    $this->resource($class, $params);
                }
               
                return;
            }
 
            $this->library('resources/'.$resource, $params, $objectName);
        }
       
        /**
         *  生成一个字符串,它是类名的首字母小写的形式.
         *
         *  @param  string  类名或者包含类名的路径.
         *
         *  @return string  类名的首字母小写的形式.
         */

        public function lcfirstClassName($className)
        {
            $return = str_replace('.php', '', trim($className, '/'));
           
            if (($lastSlash = strrpos($return, '/')) !== FALSE)
            {
                $return = substr($return, $lastSlash + 1);
            }
           
            $return = lcfirst($return);
           
            return $return;
        }
       
    }
   
    /* End of file MY_Loader.php */
    /* Location: ./application/core/MY_Loader.php */
 
复制代码


本帖被以下淘专辑推荐:

本版积分规则