在我的自动加载文件中,我有几个常用库和几个常用的自动加载模型:
$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');
但是......为什么?为什么我不能决定自动加载类的加载优先级?
由于
编辑:澄清
答案 0 :(得分:2)
AFAIK那里没有选择加载优先级的可能性,我认为只是为了避免写一条线来破解核心有点......关闭。
我不得不去搜索核心系统,看看事情是如何运作的。看起来库在模型之前是自动加载的,所以当你说你需要在调用它的一个方法之前加载模型时你是对的(虽然我没有测试过,但我觉得它的工作原理如此)。
我不知道为什么会这样做,但到目前为止,我看到的唯一解决办法是改变自己加载的顺序,但我警告你:我认为如果事情以这种方式运作那么&#39 CI开发人员考虑过的原因;这可能有你无法分辨的缺点,所以如果你发现问题,总是准备好一个缺点。 这个解决方案只是有点推测而且无法保证,我会感激您的反馈,因为我现在无法建立测试环境来证明它
转到第{11}行的system/core/loader.php
文件(方法为_ci_autoloader()
),其中"库"检查$autoload
数组的索引,并将其位置与'模型交换。索引检查是在1183行左右。
祝你好运:)。
答案 1 :(得分:1)
我个人认为您应该尽可能避免自动加载,因为无论您是否使用它们,所有资源都将保持加载状态,如here所述。
另外,请注意,模型自动加载与其他对象的自动加载有所不同。
使用模型时,CI假定模型中也可以使用任何已加载的库。因此,在模型之前加载库实际上是正确的做法。