Laravel中的服务容器是何方神圣呢?
这得从三个方面说起。自此故事开始讲起了。
数据类型本质上来说,其就是一个类,PHP解析后被实例化为一个对象。想必PHP的程序猿/媛们都知道PHP实例化要调用类的构造方法,而这个过程呢就是服务容器的初始化。
程序设计原则上来说,其就是传说中的还是高级的IoC/DI容器
程序设计模式上来说,其可以看作是一颗注册树
那么IoC/DI容器又是啥呢?
IoC:Inversion of Control 控制反转
DI:Dependency Injection 依赖注入
对于我们初学者来说觉得这两个词是多么高深莫测呀。。
好了,不说废话了,简单说下这两个词的含义:
控制反转相对于控制正转来说,有反就有正,有善就有恶。而依赖注入是控制反转的另一面的说法,都是同一个现象。
一个例子说明:七夕要到了,你的另一半给你送礼物,对于你来说,是拿礼物;而对于他/她来说,是送礼物。本质上都在讲礼物一个传递过程。而控制反转就是拿礼物,依赖注入就是送礼物。
控制正转
<?php class A { protected $b; public function __construct() { $this->b = new B(); } public function getB() { return $this->b; } } class B { public function __construct(){} } $b = (new A)->getB(); var_dump($b);
通过以上代码演示我们不难看出new A需要new B。这种主动new B的现象就是控制正转
控制反转
<?php class A { protected $ioc; public function __construct(Ioc $ioc) { $this->ioc = $ioc; } public function getB() { return $this->ioc->make('b'); } } class Ioc { protected $instances = []; public function __construct() { $this->instances['a'] = new A($this); $this->instances['b'] = new B($this); } public function make(string $abstract) { return $this->instances[$abstract] } } class B { protected $ioc; public function __construct(Ioc $ioc) { $this->ioc = $ioc; } } $ioc = new Ioc(); $a = $ioc->make('a'); $b = $a->getB(); var_dump($b);
而这段代码不需要在A中直接new B。而是让IoC容器将B给我,这就叫控制反转。
依赖注入
控制反转是站在A的立场来看的,它是拿B的。而依赖注入是站在IoC的立场来看的,它是送B的。
注册树模式
好比就是一个大箱子。所有提供服务的实例对象就是箱子里面的物品。在Laravel中还会对箱子里面的物品进行分类。没做好的物品一类并做复杂标记,做好的物品一类做唯一标记。
而当我们要使用没有做好的物品时,会对这个物品做最后加工,确保能用,才给我们用,并且把这个做好的归类到做好一类中,并把原先的复杂标记删掉。
当我们要是用做好的物品时,大箱子会直接给我们用。