You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义MVC应用调用模型方法报错:Call to a member function userList() on a non-object

解决自定义MVC中控制器调用模型方法的错误

你遇到的Notice: Undefined property: Index::$model和Fatal error: Call to a member function userList() on a non-object错误,本质是控制器里的$model属性没有被正确初始化,对应的模型实例压根不存在。下面是几个实用的排查和解决方向:

1. 确保控制器中正确实例化模型

在自定义MVC框架里,控制器不会自动帮你加载模型,得手动实例化或者用框架提供的加载方法来创建模型实例。

比如在你的Index控制器的构造函数里,补上模型实例化的代码:

class Index extends BaseController {
    public function __construct() {
        parent::__construct();
        // 实例化Index模型,把对象赋值给$this->model
        $this->model = new IndexModel();
        // 如果你的框架有统一的模型加载方法,也可以用这种方式:
        // $this->loadModel('Index');
    }

    public function index() {
        // 现在就能正常调用模型方法了
        $userData = $this->model->userList();
    }
}

核心是要保证:在调用userList()之前,$this->model已经指向一个有效的模型对象。

2. 检查模型类的加载是否正常

如果模型文件没被正确引入,或者类名和文件名不匹配,会导致实例化失败,自然$this->model就不存在:

  • 确认模型文件(比如IndexModel.php)已经被控制器通过require/include引入,或者框架的自动加载机制能找到这个文件;
  • 模型类的命名要和实例化时的类名完全一致,比如你写了new IndexModel(),那模型文件里的类必须是class IndexModel { ... }。

3. 排查重定向后的控制器执行流程

你提到当$url[0]为空时会重定向到Index控制器,要确认重定向后的控制器实例是否正常执行了模型初始化逻辑:

  • 检查重定向是否触发了控制器的构造函数(一般构造函数会自动执行,但如果有特殊路由逻辑可能例外);
  • 如果模型加载的代码放在了某个特定方法里,要确保重定向后调用的方法能触发这段加载代码。

总的来说,只要让$this->model在调用userList()之前成为一个有效的模型实例,这两个错误就会消失。

内容的提问来源于stack exchange,提问作者tapeli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:03:49