codeigniter model 里面 无法调用其他model 的问题 解决方法
昨天晚上 稀里糊涂 弄了几个model , 然后 在 一个model 里面调用其他model发现 在model 里 调用其他model无效 ?
(注: 运行环境 apache 2.2, php 5.2.3 )
也就是说 在model 里面 , 一个 方法(fun)中 写下$this->load->model('xxxmodel') ; $this->xxxmodel->xxxfun() , 会报错找不到 xxxfun 方法;
起先以为 眼睛迷糊, 写错方法, 但是 多次尝试, 还是一样 ,codeigniter 手册里面好像也没有说,model 里面不能调用其他model;
这问题今天问了 HEX , 他说目前codeigniter 是有这个问题;
分析了 ci 的代码, 看似也没什么问题,.上厕所时 , 考虑了一下 可能是php 对象的实现机制的问题;
进一步分析发现 找不到 xxxfun方法是没有 创建 xxxmodel 对象. 分析php 对象机制,发现(可能)由于 php 引用 对象有延迟 的现象;
既然这样, 那么就可以用如下方法解决:
在需要 A model调用 Bmodel时 , 在 A model 的 构造函数(__construct)中 预先加载B model ( $this->load->model('B model') )
然后 就可以 在 B model的 方法中 使用$this->B model->fun()调用 B model 的方法了;
完毕; 也可以在模型中用 get_instance() 解决 嗯,好办法
但是很奇怪,我昨天写的第一个在方法里调用就可以,结果后来写的就总是提示错误,改在构造函数里加载就好了,太邪门了 回复 1# xluohome
我以前也用过这种方法,有的时候可以,有的时候却不可以。
推荐用get_instance() 我在config/autoload.php预先加了一个公共model,
公共model类,却是可行的。。。
挺稳定的
没发现你们说的问题 也被这个问题困扰了好久,
今天赫然发现,
在坚持不使用get_instance()的前提下,
如果需要在model(A_model)里调用另外一个model(B_model)里的方法
那么只要保证load->model(B_model) 在 load->model(A_model)之前(或者同时)发生就可以。
(同时发生就是指,在A_model的构造函数里load->model(B_model))
auto_load发生在controller和其他手动load之前,所以在大多数model里都可以调用auto_load进来的model里的方法
同样,在auto_load的时候,
如果是
$autoload['model'] = array('A_model','B_model');
那么B_model可以直接调用A_model的方法,反之则出错。。。。。
虽然还不太明白是什么道理,不过从使用上讲,大概就是这么个样子
有点乱,实在记不住先load的哪个model的话,就用get_instance()吧,哈哈哈 回复 6# BillyFan
呵呵,从你说的来看,是有个装载先后顺序的,这个就和 include 一样,有先后关系。 回复 1# xluohome
但是modelB中不能有私有属性 我是实用get_instance().呵呵。 今天发现从一个model里调用另外一个model是可以调用的, 但是会死掉直接返回,现象像是数据库死锁超时,没有任何报错信息...
花了半天时间调查才发现是因为在model里load了另外一个model的缘故,
如果改成从contoller载入则不会有问题. 搜索到这里才得知也可以用get_instance解决.
考虑到model的db对象也是单例的, 恐怕这玩意栽在这个上面可能性很大,
ci应该给用户一个接口直接操纵配给连接对象
页:
[1]
2