zoukankan      html  css  js  c++  java
  • DI依赖注入/IOC控制反转

     

    DI依赖注入#

    啥都不说,直接上代码

    <?php
        class UserController 
        {
            private $user;
    
            function __construct(UserModel $user) {
                $this->user = $user;
            }
        }
    
        $user = new UserController(new UserMonel());
    ?>

    User控制器依赖UserModel,实例化的时候,直接注入。

    IOC控制反转#

    先说IOC和DI的区别吧!

    • IOC是一种设计思想
    • DI是一种设计模式

    所以两者有本质上的区别。DI是IOC的一种实现方法(还有ServiceLocator等其他设计模式)。 所谓的反转,主要指由 主动依赖被动依赖

        //主动依赖
        function __construct() {
                $this->user = new UserModel();
        }
    
        //被动依赖
        function __construct(UserModel $user) {
                $this->user = $user;
        }

    参考 浅谈IOC--说清楚IOC是什么

    二.什么是IOC容器.#

    IOC容器 是Laravel的核心设计模式,对于laravel的应用和理解是非常有必要深入学习的!

    IOC思想实现了高度解耦,那么,问题来了,如何管理这些分散的模块呢?这就是容器的任务了!

    可以想象成,在IOC容器中,装着(注册)很多模块。当用户需要一个模块的时候,可以从中拿出来。当提取的模块依赖另一个模块的时候,容器会自动注入,再返回给用户(反射机制实现)。

    是不是碉堡了?大批互相依赖的模块被完美解耦并统一管理了!

    三.什么是服务提供者(ServiceProvider).#

    假设模块一多,那么容器不是越来越大?每次加载,岂不是加载好久? 能不能弄一条管子,连接着模块,插在容器上,需要再通过管道获取呢?这样子,容器只是装着管头而已,就不怕被撑大了!

    这条管子就是 服务提供者

    file

    服务提供者本身也是一个类,不过这个类只有启动和注册两个函数。

        /**
         * Bootstrap the application services.
         *
         * @return void
         */
        public function boot()
        {
           //
        }
    
        /**
         * Register the application services.
         *
         * @return void
         */
        public function register()
        {
            //绑定到容器
            $this->app->singleton(
                'RiakContractsConnection', 
                function ($app) {
                    return new Connection($app['config']['riak']);
                }
            );
        }

    服务提供者在config/app.php中配置,laravel自动注册到容器中。

        'providers' => [
    
            /*
             * Laravel Framework Service Providers...
             */
            IlluminateAuthAuthServiceProvider::class,
            IlluminateBroadcastingBroadcastServiceProvider::class,
            ...
    
            /*
             * Application Service Providers...
             */
            appProvidersAppServiceProvider::class,
            appProvidersAuthServiceProvider::class,
            ...
        ]

    四.什么是门面(Facade).#

    程序猿总是偷懒的,每次要模块,都要去容器里面拿,多麻烦啊!找个人代拿行不?这送货小哥就叫Facade门面。文档中叫静态代理。

    送货小哥都是在config/app.php 中注册的。

        'aliases' => [
            'App'       => IlluminateSupportFacadesApp::class,
            'Config'    => IlluminateSupportFacadesConfig::class,
            'Cookie'    => IlluminateSupportFacadesCookie::class,
            'Crypt'     => IlluminateSupportFacadesCrypt::class,
            'DB'        => IlluminateSupportFacadesDB::class,
            'Route'     => IlluminateSupportFacadesRoute::class,
            ...
        ],

    查看IlluminateSupportFacadesRoute代码,可以发现只有getAccessFacade()方法,这就是交代送啥货的函数,继承了Facade这个小哥基类。

        class Route extends Facade
        {
            /**
             * Get the registered name of the component.
             *
             * @return string
             */
            protected static function getFacadeAccessor()
            {
                return 'router';
            }
        }

    注册了Facade门面后,就可以在任意地方使用了!

    文档有详细的使用方式 Laravel 架构 — Facades

    五.Application和Kernel#

    不难发现,在引导程序开始初始化的时候,也就是在boostrapapp.php文件,里面一来就new了一个 IlluminateFoundationApplication。下面分别注册了 HttpKernel、ConsoleKernel、ExceptionsHandler等。

    这里可以这么理解,new一个Application,可以看作是创造了一个空间,这个空间初始化的时候,就会为自己注入一个容器,也就是在空间中放了一个容器。

    IlluminateFoundationApplication.php 中的 registerBaseBindings() 函数可以查看到容器注入源码。

    至于kernel,可以看成是这个空间的工人,有各种各样的工人,每个工人都有自己的工作。好比HttpKernel,负责处理http请求以及控制整个请求流程。

  • 相关阅读:
    linux下小知识点积累
    马斯洛需求层次理论
    tar命令的小经验
    shell 和c语言的区别
    使用vue实现的品牌列表简单小例子
    vue的基本代码以及常见指令
    MVC和MVVM
    CSS3幽灵
    Web版App,原生App,混合App的区别以及优缺点
    常见的sql操作
  • 原文地址:https://www.cnblogs.com/agang-php/p/6233260.html
Copyright © 2011-2022 走看看