2. IoC容器是什么?
(1). 常规方式:
class A {
__construct() {
$b = new B($c);
}
}
class B {
__construct($c) {}
}
注:
类B的构造方法有传参$c,当类A在实例化中new B()的时候,也要传参.
(2). 使用Ioc/DI:
DI:(Dependency Injection)依赖注入
IoC:(Inversion of Control)控制反转
class A {
private $b;
__construct(B $b) {
$this->b = $b;
}
}
class B { }
注:
①. 把B实例化后
②. 把这个B传到A中的构造方法,同时a不再主动去new B(),变成被动等待"依赖"注入 => IoC控制反转
这样B发生变化,与A没有关系.
③. A依赖于B,而把B直接传给A. => DI依赖注入
(3). IoC/DI容器:
有了IoC和DI之后,通常会有一个IoC/DI容器,里面存放着各种类似A与B之间处理好的对应关系.
①. 在初始化的时候,通过注解或反射的方式来$b依赖于B这个类.
class A {
/**
* @Inject(B)
*/
private $b; // 这个$b依赖B
}
②. 下次要得到关系时:
$a = ioc::get("a");
$a->xx();
(4). 为什么说注解是Swoft中AOP、IoC容器的基础?
①. 因为每次初始化时,需要把类似A和B的对应关系,放到IoC容器中.
②. 传统的PHP一次请求,执行完所有代码后,内存会全部释放掉了,下一次请求还要初始化各种对应关系.没有太大的意义.
③. swoole是常驻内存的,使用IoC容器结合注解特别有意义.
(5). 常用的第三方DI库:
https://github.com/PHP_DI/PHP_DI