从自动加载的库访问自动加载的模型

时间:2012-01-05 11:18:45

标签: php codeigniter

在我的自动加载文件中,我有几个常用库和几个常用的自动加载模型:

$autoload['libraries'] = array('database','session','tools','common'....);
$autoload['model'] = array('mauth','madmin',...);

我正在调用另一个库的库中调用此代码:

class library1{
  function x(){
    $this->CI =& get_instance();
    $this->CI->library2->y();
  }
}

class library2()
  function y(){
    $this->CI =& get_instance();
    $array_notifications = $this->CI->madmin->getNotifications();
  }
}

我得到了:

Message: Undefined property: Splash::$madmin

我想我可以这样做:

$this->CI->load->model('madmin');

但是......为什么?为什么我不能决定自动加载类的加载优先级?

由于

编辑:澄清

2 个答案:

答案 0 :(得分:2)

AFAIK那里没有选择加载优先级的可能性,我认为只是为了避免写一条线来破解核心有点......关闭。

我不得不去搜索核心系统,看看事情是如何运作的。看起来库在模型之前是自动加载的,所以当你说你需要在调用它的一个方法之前加载模型时你是对的(虽然我没有测试过,但我觉得它的工作原理如此)。

我不知道为什么会这样做,但到目前为止,我看到的唯一解决办法是改变自己加载的顺序,但我警告你:我认为如果事情以这种方式运作那么&#39 CI开发人员考虑过的原因;这可能有你无法分辨的缺点,所以如果你发现问题,总是准备好一个缺点。 这个解决方案只是有点推测而且无法保证,我会感激您的反馈,因为我现在无法建立测试环境来证明它

转到第{11}行的system/core/loader.php文件(方法为_ci_autoloader()),其中"库"检查$autoload数组的索引,并将其位置与'模型交换。索引检查是在1183行左右。

祝你好运:)。

答案 1 :(得分:1)

我个人认为您应该尽可能避免自动加载,因为无论您是否使用它们,所有资源都将保持加载状态,如here所述。

另外,请注意,模型自动加载与其他对象的自动加载有所不同。

使用模型时,CI假定模型中也可以使用任何已加载的库。因此,在模型之前加载库实际上是正确的做法。