ci3与ci4控制器完全不兼容:ci3需继承ci_controller、文件名类名首字母大写、构造函数调parent::__construct();ci4需继承basecontroller、路径为app/controllers/、方法必须return view()且$data须为关联数组。

CI3 和 CI4 的控制器写法完全不兼容,直接套用会报 Fatal error: Call to undefined method 或空白页。别猜,先确认你用的是哪个版本。
CI3 控制器必须继承 CI_Controller 且文件名首字母大写
类名和文件名必须严格一致、首字母大写,否则 404;不继承 CI_Controller 会导致 $this->load、$this->db 等全部失效。
- ✅ 正确路径:
application/controllers/Blog.php - ✅ 正确类定义:
class Blog extends CI_Controller - ❌ 错误写法:
blog.php(小写)、class blog extends CI_Controller(类名小写)、class Blog(没继承) - 构造函数里必须调用
parent::__construct(),否则 session、database 等库不会初始化
CI4 控制器必须继承 BaseController 且放在 app/Controllers/
CI4 彻底废弃了 application/core/ 和 subclass_prefix,MY_Controller 不再存在,硬搬过去会直接找不到类。
- ✅ 正确路径:
app/Controllers/Blog.php - ✅ 正确类定义:
class Blog extends BaseController - ❌ 错误写法:
application/controllers/Blog.php(旧路径)、extends CI_Controller(不存在)、extends MY_Controller(CI4 无此概念) - 方法必须
return视图,不能用$this->load->view();写成return view('blog/index', $data)才生效
$this->load->view()(CI3)和 view()(CI4)传参规则完全不同
传错参数类型,视图里变量就消失,但不会报错——这是最隐蔽的坑。
- CI3:
$this->load->view('home', $data)中$data必须是关联数组,如['title' => 'Home'];传对象或索引数组,extract()失败,$title在视图中为undefined - CI4:
view('pages/home', $data)同样要求$data是关联数组,但更关键的是:漏掉return就返回空响应,页面一片空白 - 子视图路径永远相对于
app/views/(CI4)或application/views/(CI3),不是当前视图所在目录;写成'sidebar'而非'admin/sidebar'会触发Unable to load the requested file
基类复用:CI3 用 MY_Controller,CI4 直接继承 BaseController 即可
想统一加载 session、检查登录态?两个版本路径完全不同,混用必炸。
- CI3:必须在
application/core/MY_Controller.php中定义,且$config['subclass_prefix'] = 'MY_';;自定义基类(如AdminBase)要么写在同一个文件里,要么手动require_once;否则报Class 'AdminBase' not found - CI4:不需要
MY_Controller;新建app/Controllers/AdminController.php,class AdminController extends BaseController即可;BaseController已预加载session、request、response,不用再$this->load->library('session') - CI3 基类里用
$this->session->userdata()前,必须先$this->load->library('session');CI4 直接用,但要注意$this->session()->get()是新语法
版本混淆是最常被忽略的点——看一眼 system/CodeIgniter.php 文件头注释,或运行 echo CI_VERSION;,比翻文档快十倍。











