为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel 之服务容器

标签:
PHP laravel

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

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

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

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
PHP开发工程师
手记
粉丝
11
获赞与收藏
116

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消