假设我的控制器中有一个循环:
$continue = true;
while ($continue == true) {
$this->load->model('foo');
$this->foo->doSomething();
if ($this->foo->someCondition() == true) $continue = false;
unset($this->foo); //not working
//if not continue to do it
}
在此while循环中,我需要创建此foo
模型的实例,它将继续运行,直到满足某些条件($continue
将设置为false
)
为确保我在此循环中每次都创建foo
的实例,我尝试使用unset()
方法(或设置$this->foo = null
)来销毁foo
模型,不幸的是它不起作用(错误消息:Call to a member function doSomething on a non-object
)
答案 0 :(得分:2)
CodeIgniter model()
核心类的Loader
方法仅加载模型 一次:
来自 source code:
if (in_array($name, $this->_ci_models, TRUE))
{
return;
}
因此,调用model()
方法,不会再次加载模型。
这就是您收到错误的原因:Call to a member function doSomething on a non-object
我不确定你到底在寻找什么,但我很确定你需要改变你的逻辑。
答案 1 :(得分:0)
通常这不是问题,因为CI使用模型作为静态类,但是在单元测试时我发现如果我创建模型方法的模拟,我需要在之后重新加载模型。
首先,在文件application / core / MY_Loader.php中使用MY_Loader扩展CI_Loaded
class MY_Loader extends CI_Loader
{
/**
* Returns true if the model with the given name is loaded; false otherwise.
*
* @param $name
* @return bool
*/
public function is_model_loaded($name): bool
{
return in_array($name, $this->_ci_models, TRUE);
}
/**
* removes the model from the list of models
* @param $model
*/
public function unload_model($model)
{
if ($this->is_model_loaded($model))
{
$this->_ci_models = array_diff($this->_ci_models, array($model));
}
}
}
之后,在单元测试代码中,您可以取消设置CI模型。通过从_ci_models数组中删除它,CI在尝试加载时将无法找到它。 因此,单元测试设置如下所示:
public function setUp()
{
$this->CI = &get_instance();
$this->CI->assets_model=NULL;
unset($this->CI->assets_model);
$this->CI->unload_model('assets_model');
$this->CI->load->model('misc/Assets_model');
}