|
本帖最后由 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 */
复制代码
|
|