ares333 发表于 2010-6-8 09:43:44

CI1.7.2 Loader的一个bug

bug很明显,以session类为例:
$this->load->library('session',array(),'session_a');
$this->load->library('session');

如果这样写的话第二行中的session不会被初始化,当调用$this->session时会有如下错误A PHP Error was encountered
Severity: Notice
Message: Undefined property: Start::$session
Filename: libraries/Auth.php
Line Number: 45


原因,CI_Loader 813行-820行如下:
   if ( ! is_null($object_name))
   {
      $CI =& get_instance();
      if ( ! isset($CI->$object_name))
      {
       return $this->_ci_init_class($class, '', $params, $object_name);
      }
   }

解决方法也很简单,调用顺序调换一下就行了
$this->load->library('session');
$this->load->library('session',array(),'session_a');

小系统倒无妨,规模较大的系统可就有点麻烦了。

mahone 发表于 2010-6-8 11:26:07

这个……感觉也不算bug吧
你第一次调用,用别名session_a, controller对象里面就有了一个session_a属性
第二次调用,你又要加载session这个文件,然后判断你$object_name是否为null
如果为null,那ci就认为你已经加载过该类(因为你已经加载session文件,并把文件路径放在$this->_ci_loaded_files数组中)
如果不为null,那ci可以按照你指定的$object_name再给你生成一个对象

于是你可以这样写(假如你一定要这样做的话)
$this->load->library('session',array(),'session_a');
$this->load->library('session',array(),'session_b');
于是,在controller对象中,又有了session_b属性

你把两个语句换了下位置执行说行,也是因为$object_name的关系

mahone 发表于 2010-6-8 11:33:57

lz可能会反驳我,但是,我觉得,ci不是万能的,不见得能处理所有的情况
比如,controller,只支持一级目录,如果你用2级目录,好像就找不到这个controller类了
所以,我觉得,lz说的这个问题不是什么大问题。
我自己用,加载model或者library等,我都不会设置别名,我觉得这样清晰(当然你也有你自己的方法)。

Hex 发表于 2010-6-8 13:31:02

-_- 这是 CI Loader 一个很好的规避机制,只实例化一次,不是什么 BUG。
本身一个类库就不应该多次实例化,可以多次初始化,CI 的一些类库都有初始化方法。
页: [1]
查看完整版本: CI1.7.2 Loader的一个bug