继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Laravel 之服务容器

__Simple__
关注TA
已关注
手记 17
粉丝 11
获赞 116

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中还会对箱子里面的物品进行分类。没做好的物品一类并做复杂标记,做好的物品一类做唯一标记。

    而当我们要使用没有做好的物品时,会对这个物品做最后加工,确保能用,才给我们用,并且把这个做好的归类到做好一类中,并把原先的复杂标记删掉。

    当我们要是用做好的物品时,大箱子会直接给我们用。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP