不能。CodeIgniter视图无法调用模型,因模型仅挂载在控制器实例上,视图中$this指向CI_Loader对象且无模型属性;须在控制器中查询后以变量传入视图。

不能。CodeIgniter 的视图(View)层设计上不允许直接调用模型(Model),强行调用会触发 Undefined property: CI_Loader::$xxx_model 这类错误,根本原因是模型对象只挂载在控制器(Controller)实例上,视图中没有 $this 指向控制器,也没有自动注入机制。
为什么视图里写 $this->dashboard_model->get_count() 会报错
CodeIgniter 的视图是纯展示层,由 $this->load->view() 渲染时传入一个普通数组($data),此时视图内只有你显式传递的变量,$this 是 PHP 的全局作用域 $this,不是控制器实例 —— 它指向的是 CI_Loader 对象,而该对象没有 dashboard_model 属性。
常见错误现象:
- 页面空白或 500 错误
- 日志里出现
Undefined property: CI_Loader::$dashboard_model - 即使模型已在某个控制器里加载过,头部视图(如
header.php)仍无法访问
想在 header 或 footer 这类公共视图里用模型数据,该怎么做
必须把数据提前准备好,再以变量形式传入视图。核心原则:模型调用只发生在控制器(或基类/钩子中),视图只负责消费。
推荐做法:
- 在控制器的
__construct()或具体方法里调用$this->load->model('dashboard_model'),然后执行查询,例如:$data['unread_count'] = $this->dashboard_model->get_unread(); - 确保每次加载
header视图时都传了这个$data数组(哪怕只是部分键) - 如果多个控制器都要用,优先走「基类控制器」方案:所有控制器继承自
MY_Controller,在它的构造函数里统一加载常用模型和预取通用数据 - 避免在
autoload.php里自动加载模型 —— 大多数模型并不需要全站加载,会影响性能,且无法按需传参或做权限判断
$this->load->model() 的别名参数容易被忽略
当模型文件叫 user_model.php、类名为 User_model,默认加载后对象名是 $this->user_model。但下划线在变量名里易读性差,可以用别名简化:
$this->load->model('user_model', 'user');
// 之后就能写 $this->user->get_list(),而不是 $this->user_model->get_list()
这个别名只在当前控制器实例有效,不影响其他控制器;也不能在视图里用 —— 因为视图压根没执行这行代码。
真正麻烦的地方在于:很多人以为“只要在某个控制器里加载过模型,所有视图都能共享”,其实模型对象生命周期完全绑定在控制器实例上,header 视图被不同控制器反复调用时,它拿到的永远是当前控制器传进来的那批变量,不会跨控制器“继承”状态。这点不厘清,问题会反复出现。











