我在Codeigniter核心类中创建了一个类的对象,我将在我的控制器中扩展,但是在创建对象后加载模型似乎存在问题。这就是我做的事情
核心档案:
require_once('folder/systemize.php'); // class systemize is in this file
class MY_Controller extends CI_Controller {
function __construct()
{
parent::__construct();
$systemize = new systemize();
$systemize->init();
}
初始化此对象后,加载模型将无法正常工作
扩展MY_Controller的控制器文件
class Log extends MY_Controller
{
function __construct()
{
parent::__construct();
$this->load->model('access_model', 'TEST');
$this->TEST->foo('param1', 'param2'); //function inside access_model
}
它会给我这些错误 遇到PHP错误
严重性:通知消息:未定义属性:Log :: $ TEST
致命错误:在非对象上调用成员函数foo()
如果我不创建系统化对象,这些错误就会解决。有谁能告诉我如何解决这个问题?
编辑:系统化文件
class Systemize extends CI_Controller
{
function __construct() {
parent::__construct();
}
public function init() {
if('2' == '3') // false for now so it does nothing
{
$this->load->view("system/view_file");
exit();
}
}
Php错误表示在日志文件中调用了TEST-> foo
如果我在创建对象之前加载模型,它可以工作,但反之亦然。我仍然不明白Codeigniter为什么会这样?
答案 0 :(得分:1)
在浏览了Codeigniter的系统文件并在其中打印和回显后,我找到了问题的根源。现在CI_Controller的行为是当我们扩展CI_Controller时,它创建了Controller和Model的对象,并通过引用指针来存储它。
现在我做的是我用CI_Controller扩展了系统化。 MY_Controller扩展了CI_Controller,这意味着创建了$ obj,存储指向将要使用的CI的所有对象的指针。 但是当我手动创建扩展CI_Controller的systemize对象时,它只创建了Controller的对象而不是Model,并替换了$ obj。 这就是为什么加载模型会导致问题,因为$ obj中没有模型对象。
解决方案我发现的问题是我没有在MY_Controller中创建systemize的对象。相反,我使用Systemize扩展了MY_Controller,它开始完美运行。
另一种解决方案是,如果您不需要在类中使用CI功能,则可以创建类的对象,而不是使用CI_Controller扩展它。