自定义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
相关产品推荐
相关产品推荐

