- 依赖注入:解决对象之间的互相依赖关系,通过反射实现。
- 控制反转:让外部来定义具体行为
- 反射(基本使用)
- reflectionClass
- getConstructor()
- getParameters()
- getConstants()
- getProperties()
- getMethods()
- newInstanceArgs()
- laravel依赖注入:通过反射获取构造器的参数,循环获取参数的名
- 是否有依赖
- 有依赖
- 判断参数是否可选,可选则,获取可选参数的默认值进行解析。
- 不可选则,通过注册 provider 注册闭包到控制反转容器(IOC)中,返回类的实例,最后通过make来解析对象
- 没有依赖
- 直接make解析类的对象
- 有依赖
- 是否有依赖
- 服务容器-控制反转
- instance 已存在的对象(new过)
- bind
- 绑定自身 null
- 绑定闭包 closure
- new
- 需要依赖注入的类
- 接口和实现
- singleton 单例
- alias 给类设置别名,调用时
$this->app->make('alias')
- 服务解析过程:
- make的实现原理
- 获取别名,通过别名获取真实类名,
- 通过instance方式绑定的,在实例中则返回,不存在则获取真实实例进行build返回。
- 是否可build
- 可以被build的
- build后返回
- 不可以被build的
- 把实例放入make迭代,比如是接口方式,则需要把接口的实现放进去再执行一次make来build接口的实现类
- 可以被build的
- 循环额外的拓展
- 是否是共享池里面的,不是的话,放进去。下次直接可获取到。
- 通知类被解析的闭包,执行闭包回调
- 设置该类已经被解析。
- build 的实现原理
- 闭包,直接执行返回
- 通过反射来对实现类进行反向工程
- 不能被实例化抛出错误
- 设置实例进入构造堆栈中
- 获取构造函数
- 构造函数为空,直接实例类返回,构造堆栈出栈
- 获取构造函数依赖,生成构造函数依赖键值对作为参数执行获取依赖实例。
- 获取依赖
- 循环查找
- 是否已经在参数中
- 不存在
- 是否有依赖,没有则入栈依赖数组
- 有依赖,解析依赖对象,从新调用make,直至解决所有依赖。最后返回依赖,入栈到依赖数组中。(重点)
- 存在,直接入栈到依赖数组
- 不存在
- 是否已经在参数中
- 构造堆栈出栈
- 返回参数的实例
- make的实现原理