【问题标题】:Loading Model in Codeigniter after creating Object of class创建类对象后在 Codeigniter 中加载模型
【发布时间】:2026-02-03 18:30:02
【问题描述】:

我在 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()

如果我不创建 systemize 对象,这些错误就解决了。 谁能告诉我如何解决这个问题?

编辑:系统化文件

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 会这样?

【问题讨论】:

  • 该错误消息必须显示您的行号。写下您的整个systemize 类并指出行号
  • 不,不要发布您的整个代码。发布MCVE 和相应的行号。
  • 完成。希望现在你能找到问题@QPaysTaxes
  • 方法'TEST'定义在哪里?
  • 我用别名 Test 加载了模型。 $this->load->model("model_name", "Test");

标签: php codeigniter


【解决方案1】:

好的,在浏览了 Codeigniter 的系统文件并在其中打印和回显之后,我找到了问题的根源。现在 CI_Controller 的行为是,当我们扩展 CI_Controller 时,它会创建 Controller 和 Model 的对象,并通过指针的引用来存储它。

现在我所做的是使用 CI_Controller 扩展了系统化。 MY_Controller 扩展了 CI_Controller 这意味着 $obj 被创建,存储指向将使用的所有 CI 对象的指针。 但是当我手动创建系统化扩展 CI_Controller 的对象时,它只创建了 Controller 而不是 Model 的对象,并替换了 $obj。 这就是为什么加载模型会导致问题,因为 $obj 中没有模型对象。

我发现问题的解决方案是我没有在 MY_Controller 中创建 systemize 对象。相反,我使用 Systemize 扩展了 MY_Controller,它开始完美运行。

另一种解决方案是,如果您的类中不需要 CI 功能,您可以创建类对象而不使用 CI_Controller 扩展它。

【讨论】: