CodeIgniter 3.x控制器必须置于application/controllers/目录下,文件名与类名严格对应(大小写敏感),构造函数须调用parent::__construct(),index()非必需但为路由默认方法。

application/controllers/ 是唯一合法路径
CodeIgniter 3.x(主流稳定版)强制要求所有控制器文件必须放在 application/controllers/ 目录下,框架启动时只从这里自动加载和路由匹配。放错位置(比如 application/controllers/admin/ 下再建子目录嵌套控制器类)会导致 404 或 Class not found 错误,除非你显式修改了 config/routes.php 的路由规则或重写了 _remap()。
文件名与类名必须严格对应(大小写敏感)
这是最容易被忽略的硬性约定:
-
News.php文件内必须定义class News extends CI_Controller,首字母大写 - 文件名可以是小写(如
news.php),但仅在 Linux/Unix 系统下可能因文件系统大小写敏感而失败;Windows 下常侥幸通过,上线后立刻报错 - 类名里不能有下划线(
News_controller❌)、连字符(news-controller❌)或数字开头(1news❌) - 若用命名空间(CI 3.1.11+ 支持有限),需手动配置
config/autoload.php并确保 PSR-4 路径映射正确,不推荐新手尝试
构造函数里不要漏掉 parent::__construct()
几乎所有控制器都需要加载模型、辅助函数或库,而这些依赖都通过 $this->load 提供——它来自父类 CI_Controller 的初始化逻辑。如果忘记调用 parent::__construct():
-
$this->load会是null,调用$this->load->model()直接抛出Fatal error: Call to a member function model() on null - 即使没报错,
$this->input、$this->uri等超级对象也无法使用 - 常见错误写法:
public function __construct() { $this->load->helper('url'); }—— 缺少parent::__construct()就全失效
index() 方法不是必须的,但路由默认找它
URL 如 /news 默认触发 News::index(),但这只是路由约定,不是语法强制:
- 你可以删掉
index(),只要在routes.php显式绑定:$route['news'] = 'news/latest'; - 方法名只要不是 PHP 魔术方法(如
__get)、不以_开头(会被视为私有,拒绝访问),就能被路由到 - 带参数的方法(如
view($slug))会自动接收 URL 片段,但注意:CI 不做类型推导,$slug始终是字符串,需自行校验或过滤
news.php 里写成 class news 的问题,一上 Linux 服务器就彻底挂掉。


















