Altair 发表于 2014-8-9 12:09:20

让你的类名和类文件支持驼峰命名法

本帖最后由 Altair 于 2014-8-9 12:10 编辑

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

<?phpif ( ! 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. 默认类对象名仅首字母小写.
         *
         *@paramstring类名.
         *@parammixed   参数,可选.
         *@paramstring实例对象名,可选.
         *
         *@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);
      }
      
      /**
         *生成一个字符串,它是类名的首字母小写的形式.
         *
         *@paramstring类名或者包含类名的路径.
         *
         *@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 */


页: [1]
查看完整版本: 让你的类名和类文件支持驼峰命名法