
本文详解 CodeIgniter 3 中模型的加载与调用方式,指出直接 new 实例化自定义命名空间模型会导致“Class not found”错误,并提供标准、安全、符合框架规范的解决方案。
本文详解 codeigniter 3 中模型的加载与调用方式,指出直接 `new` 实例化自定义命名空间模型会导致“class not found”错误,并提供标准、安全、符合框架规范的解决方案。
在 CodeIgniter 3 中,模型(Model)并非传统 PHP 的独立类文件,而是需通过框架内置的加载机制进行注册和实例化。你遇到的错误:
Type: Error Message: Class 'models\TestModel' not found
根本原因在于:CodeIgniter 3 默认不支持 PSR-4 自动加载或命名空间类的直接 new 实例化。即使你在控制器中声明了 use \models\TestModel;,框架也不会自动识别该路径或加载对应文件——因为 CI3 的模型加载器基于约定优于配置(Convention over Configuration),它只认 application/models/ 目录下的 .php 文件,且默认忽略命名空间。
✅ 正确做法是:始终通过 $this->load->model() 加载模型,再以 $this->ModelName->method() 方式调用(注意:不是 new ModelName())。这是 CI3 官方推荐且唯一可靠的方式。
✅ 推荐写法(标准、安全、可维护)
<?php defined('BASEPATH') OR exit('No direct script access allowed');
class TestController extends CI_Controller {
public function __construct() {
parent::__construct();
// 在构造函数中加载模型(推荐:一次加载,多处复用)
$this->load->model('TestModel'); // 文件名:application/models/TestModel.php
}
public function student() {
// ✅ 正确调用:通过 $this->ModelName 访问(首字母大写,无下划线)
$value = $this->TestModel->student_college();
echo $value;
}
}
⚠️ 注意事项:
- 模型文件必须存放在 application/models/TestModel.php(CI3 不支持子目录嵌套如 models/test/TestModel.php,除非手动配置);
- 类名必须与文件名一致(如 class TestModel extends CI_Model);
- 不要使用 new TestModel() 或 use \models\TestModel —— CI3 的 autoloader 不处理命名空间,强行使用将导致致命错误;
- 若需在多个方法中使用模型,建议统一在 __construct() 中加载;若仅单次使用,也可在方法内加载(但不推荐);
- 模型类必须继承 CI_Model,否则无法享受框架服务(如数据库连接、辅助函数等)。
? 补充说明:为什么 new TestModel() 会失败?
CodeIgniter 3 的核心加载器(Loader 类)并未集成 Composer autoloader,也不解析 PHP 命名空间。当你执行 new TestModel() 时,PHP 尝试按当前命名空间查找类,而你的 TestModel 并未声明为 namespace models;,更未被 spl_autoload_register() 注册——因此必然抛出 Class not found。
? 提示:如需升级至命名空间友好架构,建议迁移到 CodeIgniter 4(原生支持 PSR-4、命名空间及依赖注入),CI3 本质是“无命名空间”的轻量级框架。
总结:遵循 CI3 规范,用 $this->load->model() 加载,用 $this->ModelName->method() 调用——简洁、稳定、零兼容风险。











