我对CodeIgniter有一个哲学问题,以及它的模型在将“new”用于实例时的作用。
在我看来,这个想法,就是你用来举例说使用一本书的模型
$this->load->model("book_model")
而不是
new book_model
我的意思是,因为你只加载book_model一次,你将只有一个book_model的实例,如果你想模拟多本书,你将在book_model中使用createNewBook函数,而不是通过使用“new”后的_construct函数。
这样看是不对的?我的意思是考虑我使用相同的book_model实例和一个函数“initiateBook”?我们应该考虑永远不要在CodeIgniter中使用“new”吗?
答案 0 :(得分:3)
实际上,当您致电$this->load->model("book_model")
时,CodeIgniter
会为您完成工作,这意味着CodeIgniter
的{{1}}有一个方法Loader class
来实例化该模型您已作为参数传递,例如public function model(...)
。
取自book_model
中的model function
(位于Loader class
)
system/core
检查if (in_array($name, $this->_ci_models, TRUE))
{
return;
}
受保护的数组以查看所请求的模型是否已加载,然后加载_ci_models
,如果未加载,则加载它,即(模型方法的最后一段)
returns
因此,您不需要使用$CI->$name = new $model(); // here $model is a variable which has the name of the requsted model
$this->_ci_models[] = $name; // stores the instantiated model name in the _ci_models[] array
return; // then returns
手动实例化它,一旦模型(同样适用于其他库或类)加载,您就可以在脚本中的任何位置访问/使用它。
由于new
使用Singleton(an answer on SO about singleton pattern)设计模式,因此您只有一个超级全局CodeIgniter
对象(一个CodeIgniter实例)可用,并且它可以包含您的所有内容已加载或您将加载。
加载$CI
模型,然后调用该模型的book_model
方法
initiateBook()