用途:介绍 Bitrix\Main\DI\ServiceLocator(PSR-11 容器)在 main 23.0+(验证至 26.800.0)下的服务注册与获取规则。构造函数注入仅适用于服务;控制器通过 action 参数注入;命令与事件处理器不适用;领域类不接触容器。
主要能力:get($id) 的解析规则(main 26.250 起)——已构建或 addInstance() 返回同一实例;未注册但类存在则自动装配(每个构造参数取 get(其类型),有默认值用默认值);注册的接口/抽象类按 className 实现自动装配(忽略 constructorParams),构造函数闭包以 constructorParams 为参数调用;注册的具体类或字符串 id 用 new $class(...array_values(constructorParams)),不自动装配,闭包不再传参。实例默认按进程缓存,除非条目带 'singleton' => false。循环依赖抛 CircularDependencyException;无类型、联合或标量参数且无默认值抛 ServiceNotFoundException。26.250 之前所有已注册键按 new $class(...constructorParams) 或 constructor() 构建,未注册类仅当构造参数均为具体类时才自动装配,无 singleton 选项。
使用方式:在 /local/modules/vendor.module/.settings.php(Loader::includeModule() 时注册)或全局 settings 的 'services' 下注册,支持接口到实现、工厂、位置参数(闭包在首次 get() 时求值),并设 'readonly' => true。优先使用 FQCN 键;字符串 id 属内核风格。内核注册 Application、Routing\Router、DB\Connection、Data\Cache、Data\ManagedCache、Data\TaggedCache、EventManager、Data\ConnectionPool、\CUserTypeManager(26.250 起)、Data\Storage\PersistentStorageInterface(25.1100 起)。获取方式:服务用构造参数;控制器 action 用具体类类型提示(接口不解析);消息接收器用 get(FQCN) 自动装配,控制台命令和事件处理器需在 execute()/处理器内调用 ServiceLocator::getInstance()->get(Foo::class);has($id) 只对已注册或已构建 id 为真。
覆盖与限制:先注册者优先,registerByModuleSettings() 跳过已存在键;可在 /local/.settings_extra.php 全局服务中覆盖(应用启动时注册,早于模块),或运行时用 addInstance($id, $object)/addInstanceLazy($id, ['className' => …])。服务按进程单例,勿在属性保存请求级状态;长驻消费者会保留实例。不要用仅需其他类的具体类注册;配置通过工厂传类型化对象或标量;功能开关用 Bitrix\Main\Config\Feature(26.700 起)。