/laravel IOC理解以及依赖注入

废话不说直接上实例

//laravel IOC理解以及依赖注入 DIinterface SuperModuleInterface{    /**
     * 超能力激活方法
     *
     * 任何一个超能力都得有该方法,并拥有一个参数
     *@param array $target 针对目标,可以是一个或多个,自己或他人
     */
    public function activate(array $target);
}class XPower implements SuperModuleInterface{    public function activate(array $target)
    {        // 这只是个例子。。具体自行脑补
    }
}/**
 * 终极炸弹 (就这么俗)
 */class UltraBomb implements SuperModuleInterface{    public function activate(array $target)
    {        // 这只是个例子。。具体自行脑补
    }
}class Superman{    protected $module;    public function __construct(SuperModuleInterface $module)
    {        $this->module = $module;
    }
}class Container{    public $binds;    public $instances;    public function bind($abstract, $concrete)
    {        if ($concrete instanceof Closure) {            $this->binds[$abstract] = $concrete;
        } else {            $this->instances[$abstract] = $concrete;
        }
    }    public function make($abstract, $parameters = [])
    {        if (isset($this->instances[$abstract])) {            return $this->instances[$abstract];
        }

        array_unshift($parameters, $this);        return call_user_func_array($this->binds[$abstract], $parameters);
    }
}// 创建一个容器(后面称作超级工厂)$container = new Container;// 向该 超级工厂添加超人的生产脚本$container->bind(‘superman‘, function($container, $moduleName) {    return new Superman($container->make($moduleName));
});// 向该 超级工厂添加超能力模组的生产脚本$container->bind(‘xpower‘, function($container) {    return new XPower;
});// 同上$container->bind(‘ultrabomb‘, function($container) {    return new UltraBomb;
});// ****************** 华丽丽的分割线 **********************// 开始启动生产$superman_1 = $container->make(‘superman‘, [‘xpower‘]);var_dump($container->binds);die;$superman_2 = $container->make(‘superman‘, [‘ultrabomb‘]);$superman_3 = $container->make(‘superman‘, [‘xpower‘]);var_dump($superman_1);die;// ...随意添加

laravel核心就是服务容器.所有的服务提供者绑定到容器中.细致的讲解可以取作者的官网进行查看 整个IOC的核心应该是make方法的call_user_func_array()函数的调用

$container->bind(‘superman‘, function($container, $moduleName) {    return new Superman($container->make($moduleName));
});

闭包函数

function($container, $moduleName) {     return new Superman($container->make($moduleName));
}

恰好给call_user_fun_array()的第一个参数使用. 执行完三次bind之后,$container->bind中有了三个key->value的 闭包 当再次执行$container->make(‘superman‘,[‘xpower‘])时,$container->binds中superman对应上述代码的闭包,参数为[$container,xpower] 执行 new Superman($container->make($moduleName))时,对应$container->make(‘xpower‘);则再次走call_user_func_array()的流程,return new xpower()给Superman的construst. 所以IOC实质就是2次调用call_user_func_array();

注:该代码引用自https://www.insp.top/article/learn-laravel-container

时间: 2024-10-08 03:18:39

/laravel IOC理解以及依赖注入的相关文章

控制反转(IoC)与依赖注入(DI)

前言 最近在学习Spring框架,它的核心就是IoC容器.要掌握Spring框架,就必须要理解控制反转的思想以及依赖注入的实现方式.下面,我们将围绕下面几个问题来探讨控制反转与依赖注入的关系以及在Spring中如何应用. 什么是控制反转? 什么是依赖注入? 它们之间有什么关系? 如何在Spring框架中应用依赖注入? 什么是控制反转 在讨论控制反转之前,我们先来看看软件系统中耦合的对象.图1:软件系统中耦合的对象从图中可以看到,软件中的对象就像齿轮一样,协同工作,但是互相耦合,一个零件不能正常工

解构控制反转(IoC)和依赖注入(DI)

1.控制反转 控制反转(Inversion of Control,IoC),简言之就是代码的控制器交由系统控制,而不是在代码内部,通过IoC,消除组件或者模块间的直接依赖,使得软件系统的开发更具柔性和扩展性.控制反转的典型应用体现在框架系统的设计上,是框架系统的基本特征,不管是.NET Framework抑或是Java Framework都是建立在控制反转的思想基础之上. 控制反转很多时候被看做是依赖倒置原则的一个同义词,其概念产生的背景大概来源于框架系统的设计,例如.NET Framework

理解PHP 依赖注入|Laravel IoC容器

看Laravel的IoC容器文档只是介绍实例,但是没有说原理,之前用MVC框架都没有在意这个概念,无意中在phalcon的文档中看到这个详细的介绍,感觉豁然开朗,复制粘贴过来,主要是好久没有写东西了,现在确实很懒变得! 首先,我们假设,我们要开发一个组件命名为SomeComponent.这个组件中现在将要注入一个数据库连接. 在这个例子中,数据库连接在component中被创建,这种方法是不切实际的,这样做的话,我们将不能改变数据库连接参数及数据库类型等一些参数. 01 <?php 02   0

理解 PHP 依赖注入 | Laravel IoC容器

Laravel框架的依赖注入确实很强大,并且通过容器实现依赖注入可以有选择性的加载需要的服务,提高初始化框架的开销,下面是我在网上看到的一个帖子,写的很好拿来与大家分享,文章从开始按照传统的类设计数据库连接一直到通过容器加载服务这个高度解耦的设计展示了依赖注入的强大之处,值得我们借鉴和学习. -----------------------------------------------------------分割线下面是大牛的原文---------------------------------

看laravel源码学习依赖注入

前言 初心 最近在看设计模式中的依赖注入,希望借助设计模式的神奇魔力,能达到一个目的,然后在此学习的过程中,能收获一个bonus.这个目的就是能使得自己设计的系统更简单更容易理解,或者是使得系统设计的结构和代码更简单,而bonus是企图在设计模式上实现概念上的并发.这篇文章是希望把自己这段时间的学习成果作一个记录和总结,然而并不要太期待,因为目前得出的结论并没有达到我的目的,bonus暂时希望也比较渺茫. 在知识网络结构认知上的准备 我们需要提前了解一下依赖倒置原则.控制反转和依赖注入的关系.控

Spring学习3—控制反转(IOC)Spring依赖注入(DI)和控制反转(IOC)

一.思想理解 Spring 能有效地组织J2EE应用各层的对象.不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO对象,都可在Spring的 管理下有机地协调.运行.Spring将各层的对象以松耦合的方式组织在一起,Action对象无须关心Service对象的具体实现,Service对 象无须关心持久层对象的具体实现,各层对象的调用完全面向接口.当系统需要重构时,代码的改写量将大大减少. 上面所说的一切都得宜于Spring的核心机制,依赖注入.依赖注入让bean与

PHP控制反转(IOC)和依赖注入(DI)

先看一个例子: <?php class A { public $b; public $c; public function A() { //TODO } public function Method() { $this->b=new B(); $this->c=new C(); $this->b->Method(); $this->c->Method(); //TODO } } class B { public function B() { //TODO } pu

控制反转(IOC)和依赖注入(DI)的区别

IOC   inversion of control  控制反转 DI   Dependency Injection  依赖注入 要理解这两个概念,首先要搞清楚以下几个问题: 参与者都有谁? 依赖:谁依赖于谁?为什么需要依赖? 注入:谁注入于谁?到底注入什么? 控制反转:谁控制谁?控制什么?为何叫反转(有反转就应该有正转了)? 依赖注入和控制反转是同一概念吗? 下面就来简要的回答一下上述问题,把这些问题搞明白了,IoC/DI也就明白了.(1)参与者都有谁: 一般有三方参与者,一个是某个对象:一个

初识Spring框架实现IOC和DI(依赖注入)

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是什么 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想. 在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制.如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转