|
本帖最后由 kinwyb 于 2013-7-4 08:48 编辑
原始代码是
PHP复制代码 class CI_Module {
/**
* Constructor
*
* @access public
*/
function __construct ()
{
// 实例化自己的 Loader 类
$CI =& get_instance ();
$this->load = clone $CI->load;
// CI 系统对象采用引用传递的方式,直接赋值给 Module。
// 当然也可以采用 clone 的方式,可能需要根据不同项目做权衡。
foreach ($CI->load->get_base_classes() as $var => $class)
{
// 排除 Loader 类,因为已经 clone 过了
if ($var == 'loader')
{
continue;
}
// 赋值给 Module
$this->$var =& load_class ($class);
}
// 处理自动装载的类库和模型
$autoload = array_merge($CI->load->_ci_autoload_libraries , $CI->load->_ci_autoload_models );
foreach ($autoload as $item)
{
if (!empty($item) and isset($CI->$item))
{
$this->$item =& $CI->$item;
}
}
// 处理数据库对象
if (isset($CI->db))
{
$this->db =& $CI->db;
}
// 利用 PHP5 的反射机制,动态确定 Module 类名和路径
$reflector = new ReflectionClass ($this);
$path = substr(dirname($reflector->getFileName()), strlen(realpath(APPPATH .'modules').DIRECTORY_SEPARATOR));
$class_path = implode('/', array_slice(explode(DIRECTORY_SEPARATOR, $path), 0, -1));
$class_name = $reflector->getName();
// 通知 Loader 类,Module 就绪
$this->load->_ci_module_ready ($class_path, $class_name);
// 把自己放到全局超级对象中
$CI->$class_name = $this;
log_message ('debug', "$class_name Module Class Initialized");
}
} 复制代码
// 把自己放到全局超级对象中
$CI->$class_name = $this;
这句代码有什么用处?难道module能像model一样引用一次然后重复使用么?
还有就是发现原来的很多都是从CI里引用(复制)方法到$this
$this->$item =& $CI->$item;
那为什么不直接改成直接从CI里取
PHP复制代码
class CI_Module
{
/**
* Constructor
*
* @access public
*/
function __construct ()
{
// 实例化自己的 Loader 类
$CI =& get_instance ();
$this->load =clone $CI->load;
// 利用 PHP5 的反射机制,动态确定 Module 类名和路径
$reflector = new ReflectionClass ($this);
$path = substr(dirname($reflector->getFileName()), strlen(realpath(APPPATH .'modules').DIRECTORY_SEPARATOR));
$class_path = implode('/', array_slice(explode(DIRECTORY_SEPARATOR, $path), 0, -1));
$class_name = $reflector->getName();
// 通知 Loader 类,Module 就绪
$this->load->_ci_module_ready ($class_path, $class_name);
log_message ('debug', "$class_name Module Class Initialized");
}
function __get ($key)
{
$CI =& get_instance ();
return $CI->$key;
}
}
复制代码
这样貌似也没出现什么错误,但是为什么不这么写?这么写是不是会出现问题
小白求解释
|
|