我必须在CodeIgniter中这样做:
$this->load->model('Test_model');
$this->Test_model->....
我只想:
$this->Test_model->...
我不想自动加载所有模型,我想按需加载模型。
如何向CI_Controller
添加“延迟加载”逻辑? __get()
?我应该添加什么逻辑?
提前致谢!
PS请不要将我的问题与CodeIgniter lazy-loading libraries/models/etc混淆 - 我们有不同的目标。
当前解决方案
更新您的CI_Controller::__construct()
(路径system/core/Controller/
),例如
foreach (is_loaded() as $var => $class)
{
$this->$var = '';
$this->$var =& load_class($class);
}
$this->load = '';
$this->load =& load_class('Loader', 'core');
然后向CI_Controller
类
public function &__get($name)
{
//code here from @Twisted1919's answer
}
答案 0 :(得分:3)
以下似乎在ci中不起作用(事实上,魔术方法不起作用),我会留在这里作为对其他人的反思。
嗯,在你的具体情况下,这应该(在你的MY_Controller中):
public function __get($name)
{
if (!empty($this->$name) && $this->$name instanceof CI_Model) {
return $this->$name;
}
if (is_file(APPPATH.'models/'.$name.'.php')) {
$this->load->model($name);
return $this->$name;
}
}
L.E,第二次尝试:
public function __get($name)
{
if (isset($this->$name) && $this->$name instanceof CI_Model) {
return $this->$name;
}
if (is_file($modelFile = APPPATH.'models/'.$name.'.php')) {
require_once ($modelFile);
return $this->$name = new $name();
}
}
但是,你需要注意帮助者,图书馆等。