ci 4.3 和 4.4 的服务容器配置无实质性差异,核心机制(反射解析、闭包绑定、单例/工厂模式、services.php 注册)完全一致,仅 factory() 辅助函数参数签名收紧为强制闭包,其余配置与陷阱均相同。

CI 4.3 和 4.4 的服务容器配置没有实质性差异
CodeIgniter 4.4 并未重构服务容器机制,它沿用了 4.3 的核心设计:依赖反射自动解析类型提示、支持闭包绑定、单例/工厂模式、Services.php 集中注册。官方 changelog 中未列出任何关于 $container->set()、service() 或构造函数注入行为的 breaking change。
唯一需注意的兼容性细节是 factory() 辅助函数的参数签名
CI 4.4.0 起,factory() 函数(用于多实例场景)的第二个参数从可选数组改为强制传入闭包或 callable:
- CI 4.3 允许:
factory('MyService', ['arg1' => 'value']) - CI 4.4 要求:
factory('MyService', function () { return new MyService('value'); })
这不是服务容器本身的变更,而是辅助函数的 API 收紧——如果你没用过 factory(),这个改动对你零影响;如果用了,升级时需检查调用处是否传了闭包。
配置写法和常见陷阱完全一致,别被版本号误导
无论是 4.3 还是 4.4,以下逻辑都成立:
- 标量参数(如
string、int)仍无法自动注入,必须用闭包绑定:$container->set('FileLogger', function() { return new FileLogger('debug', '/path/log.txt'); }); -
app/Config/Services.php中的静态方法(如public static function myService())仍通过service('myService')获取,行为无变化 - 控制器构造函数中类型提示注入(如
RequestInterface、Database)依然由容器自动完成,无需额外配置
真正容易出问题的从来不是版本差异,而是把 CI3 的习惯带进 CI4:比如在构造函数里漏掉 parent::__construct() 却又想用 $this->request,或者把 app/Config/Database.php 写成数组返回而非类属性——这些在 4.3 和 4.4 里都会报错,且错误表现一模一样。











