codeigniter 3 中向视图传递数据必须通过 $this->load->view() 的第二个参数传入关联数组,框架用 extract() 将键名转为变量;直接赋值类属性、全局变量或对象无效,且每次 view() 调用都需显式传入 $data。

CodeIgniter 3 中向视图传递数组,必须用 $this->load->view() 的第二个参数传入关联数组,键名会自动转成视图中的变量名;直接赋值类属性、全局变量或对象属性到视图里是无效的。
必须用 $data 关联数组作为 view() 第二个参数
CodeIgniter 的视图加载机制只识别 $this->load->view('page', $data) 中的 $data 参数,且它必须是关联数组。框架内部会用 extract($data) 把键名转为变量,所以 $data['user'] 在视图里就变成 $user。
-
$data必须在调用view()前定义,比如$data = [];再逐个赋值,否则未声明的键可能被忽略 - 不能传对象(如
$this->user_model),必须先转成数组:$data['user'] = (array) $user_obj; - 嵌套数组可以传,但视图里要按层级访问:
$data['profile']['name']→ 视图中写$profile['name'] - 如果传了同名键(比如两次
$data['title'] = ...),后赋的值会覆盖前一个
$data 里不能直接放函数调用或动态表达式
虽然语法上允许写 $data['now'] = date('Y-m-d');,但容易引发时序问题——比如你在循环里反复修改 $data 后再统一 view(),中间逻辑出错会导致变量丢失。
- 推荐把计算逻辑收拢到控制器顶部,避免在
$data构建过程中混入副作用操作 - 不要在
$data里放闭包或未初始化的变量,例如$data['callback'] = function() { ... };—— 视图里无法直接调用 - 若需模板级复用逻辑,应改用 CodeIgniter 的
Parser类或自定义辅助函数,而不是塞进$data
多个视图共用同一组变量时,别重复传 $data
如果你在控制器里连续加载多个视图(比如 header、content、footer),每个 view() 调用都得显式传 $data。框架不会自动继承上一次传的变量。
- 错误写法:
$this->load->view('header', $data); $this->load->view('content'); // 这里 $data 没传,$title 等变量不可用 - 正确写法:每个
view()都带$data,哪怕内容一样:$this->load->view('header', $data); $this->load->view('content', $data); $this->load->view('footer', $data); - 若变量较多,可封装成方法提前生成:
$data = $this->_get_common_view_data();,但注意该方法仍需返回数组,不能返回对象或字符串
最常被忽略的一点是:CodeIgniter 3 的视图变量作用域完全由 view() 调用时传入的数组决定,和控制器类的属性、PHP 全局变量、甚至 $this 实例本身都无关。哪怕你在控制器里写了 $this->title = 'Home';,视图里也拿不到 $title —— 除非你把它放进 $data['title'] 并传进去。










