依赖注入容器可基于原型链实现轻量级服务注册与解析:将服务工厂存于构造函数原型的私有属性中,实例通过get方法沿原型链查找并缓存实例,支持单例与瞬态生命周期,原型链仅提供共享注册表和方法复用,解析逻辑仍在实例方法内。

依赖注入容器的核心是管理对象的创建和依赖关系,原型链本身不直接提供“注入”能力,但它可以作为实现轻量级容器的基础机制——通过构造函数的 prototype 链模拟“继承式服务查找”,或配合工厂函数+原型委托实现按需解析。关键不是用原型链“替代” DI,而是利用它做服务注册与解析的底层支撑。
用构造函数原型模拟服务注册表
把容器设计成一个构造函数,其原型上挂载所有已注册的服务(工厂函数或实例),后续实例可通过原型链访问这些服务,避免每次重复查找。
- 定义容器构造函数,不初始化实例状态,只作原型载体
- 在
Container.prototype上添加register(name, factory)方法,将工厂存入原型属性(如this._services = {}) - 注意:不能直接往
prototype上挂服务函数(会污染所有实例),应统一存在私有属性里,再通过原型方法读取
通过原型委托实现依赖解析
当某个服务需要其他服务时,不硬编码 import 或 new,而是调用容器提供的 get(name) 方法;该方法先尝试从自身实例缓存取,未命中则沿原型链向上找注册的工厂并执行。
ThinkPHP 5.1.42 是 ThinkPHP 框架 5.1 系列中极具稳定性的成熟版本,专为 PHP 5.6+ 环境设计。它在 5.0 基础上全面重构,引入了依赖注入容器、Facade facade 支持、对象化路由系统及中间件机制(5.1.6+),并原生支持 Swoole/Workerman 常驻内存运行(5.1.18+)。该版本取消了系统常量,采用更优雅的类库别名机制,完美平衡了开发效
-
get(name)先检查实例自有属性(如this._cache[name]),有则返回 - 没有则查
this._services[name](由register存储),调用工厂生成实例并缓存 - 工厂函数中若需其他服务,可接收容器实例作为参数(如
container => new HttpService(container.get('logger'))),形成依赖传递
支持单例与瞬态生命周期
原型链本身不区分生命周期,需靠容器逻辑控制:单例复用实例缓存,瞬态每次调用工厂新建。
- 注册时指定
{ singleton: true }或用不同方法名(如registerSingleton/registerTransient) - 单例模式下,
get()缓存首次结果;瞬态模式下,每次调用工厂函数,不写缓存 - 原型链在此处的作用是让所有容器实例共享同一套注册表(
_services存于原型),但实例各自维护独立缓存(_cache在实例上)
避免原型污染,合理封装内部状态
直接操作 prototype 容易引发意外覆盖,推荐用闭包或 Symbol 模拟私有字段,保持接口干净。
- 用
Symbol作为键存储服务映射(如const SERVICES = Symbol('services')),防止外部误改 - 或把注册表放在构造函数闭包内,所有实例方法通过闭包访问,原型只暴露
register和get - 不暴露
_services等内部属性,避免使用者绕过容器逻辑直接取值
不复杂但容易忽略:原型链在这里不是用来做“类继承式注入”,而是为多个容器实例提供统一注册中心 + 方法复用。真正的依赖解析逻辑仍在实例方法里,原型只是让这套逻辑可复用、易组织。










