必须调用parent::__construct(),否则服务容器无法初始化核心服务,导致依赖注入失败、类加载异常及“class not found”等错误。

CI4服务容器报错“Class not found”时,先确认是不是构造函数没调用父类
CodeIgniter 4 的服务容器依赖 parent::__construct() 触发初始化流程。如果控制器或服务类重写了 __construct() 却没调用它,容器就无法注入会话、数据库等核心服务,后续任何依赖这些服务的代码都会因类加载失败而中断——表面看是“找不到类”,实际是服务未注册导致类型提示解析失败。
- 检查所有自定义控制器、服务类、模型的构造函数,确认第一行是
parent::__construct(); - 若用了依赖注入(如
Session $session),但省略了父类调用,Session类本身可能被加载,但容器不会把它注入到参数里,最终抛出ClassNotFoundException或空对象调用错误 - 特别注意:CI4 中过滤器在构造函数之后执行,所以权限校验类不能只靠构造函数拦截,否则容器还没准备好就报错了
服务名注册不匹配,导致容器 resolve() 失败
CI4 容器通过服务名(字符串键)查找类,不是直接按类名加载。比如你注册了 MyService 到键 'my_service',但代码里写 $this->container->get('MyService'),就会报“Class not found”——因为容器根本没这个键。
- 检查
app/Config/Services.php中的静态方法,确认注册键名和get()调用时传入的字符串完全一致(大小写敏感) - 若用
singleton()或injector()注册,确保类路径正确且类文件存在,例如AppLibrariesMyHelper::class要对应真实路径app/Libraries/MyHelper.php - 避免在
Services.php中拼错类名,比如写成AppModelsUserModelm(多了个 m),PHP 不会报语法错,但运行时容器找不到该类
自动加载失效:composer autoload 没覆盖到你的类目录
CI4 默认只把 app/ 下的命名空间纳入 Composer 自动加载("psr-4": { "App": "app/" })。如果你把服务类放在 src/、lib/ 或其他非标准路径,即使类存在、命名正确,容器调用 Class.forName() 或反射时也会触发 ClassNotFoundException。
- 运行
composer dump-autoload -o强制刷新自动加载映射 - 检查
composer.json的psr-4配置,新增路径需手动加进去,例如:"MyLib\": "lib/" - 临时验证:在控制器里直接
var_dump(class_exists('AppServicesMyService')),返回false就说明自动加载没生效
环境差异导致类加载路径不一致
开发环境能跑,生产环境报“Class not found”,大概率是 autoloader 缓存或文件权限问题。CI4 在 production 环境默认启用 OPcache,而 Composer 的 autoloader 可能缓存了旧的类映射,或者部署时漏传了某些目录。
- 清空
app/Cache/和writable/cache/下所有内容 - 确认生产服务器上
composer install --no-dev --optimize-autoloader执行成功,且没有跳过app/目录 - 检查文件权限:web 用户必须对
app/和vendor/有读取权限,否则类文件虽存在却无法加载
真正卡住人的地方往往不是类名写错,而是容器注册键名和调用不一致,或者自动加载配置没同步到生产环境——这两个点不逐行核对,光看报错信息容易绕远路。











