关闭

PHP 依赖注入(DI)和控制反转(IoC)简单理解

标签: PHP
746人阅读 评论(2) 收藏 举报
分类:
<?php
// ************************************ 工厂模式 ***************************************
// 代码来源:http://laravelacademy.org/post/769.html  在此基础上稍作修改
interface SuperModuleInterface {   //接口  
    //超能力激活方法
    public function activate();
}
//X-超能量
class XPower implements SuperModuleInterface {
    public function activate() {
        echo "this is XPower"."<br>";
    }
}
//终极炸弹
class UltraBomb implements SuperModuleInterface {
    public function activate() {
        echo "this is UltraBomb"."<br>";
    }
}

//超人类
class Superman {
    protected $module;  //模块
    public function __construct(SuperModuleInterface $module) {
        $this->module = $module;
    }

    public function activate()  {
        $this->module->activate();
    }
}
// 超能力模组
$superModule = new XPower;
// 初始化一个超人,并注入一个超能力模组依赖
$superMan = new Superman($superModule);
$superMan->activate();


// ************************************ IoC/DI ***************************************
interface BehaviorInterface {   //接口  
    public function behavior_func();
}
class SleepInterface implements BehaviorInterface {
    public function behavior_func() {
        echo "this is sleep_func"."<br>";
    }
}
class EatInterface implements BehaviorInterface {
    public function behavior_func() {
        echo "this is eat_func"."<br>";
    }
}

class BehaviorClass {
    protected $module;
    public function __construct(BehaviorInterface $module) {
        $this->module = $module;
    }
    public function behavior_func()  {
        $this->module->behavior_func();
    }
}

class Container  {  //容器
    protected $binds;
    public function bind($abstract,Closure $concrete) {
        $this->binds[$abstract] = $concrete;
    }

    public function make($abstract, $parameters = []) {
        array_unshift($parameters, $this);
        return call_user_func_array($this->binds[$abstract], $parameters);
    }
}

// 创建一个容器(后面称作超级工厂)
$container = new Container;
// 向该 超级工厂添加行为的生产脚本
$container->bind('BehaviorClass', function($container, $moduleName) {
    return new BehaviorClass($container->make($moduleName));
});
// 向该 超级工厂添加模组的生产脚本
$container->bind('EatInterface', function($container) {
    return new EatInterface;
});
// 同上
$container->bind('SleepInterface', function($container) {
    return new SleepInterface;
});

// 开始启动生产
//最主要是call_user_func_array   要先理解 最主要是call_user_func_array
/** make方法 大概理解是  调用绑定好的BehaviorClass方法(bind)  然后把EatInterface传入调用call_user_func_array
 (即调用return new BehaviorClass($container->make($moduleName))这个方法)
 (这里的$moduleName为了形象一点也指EatInterface)  在传入的同时其实是先进了里面的$container->make($moduleName)方法 
用call_user_func_array把EatInterface先给new了  接着才new外面的BehaviorClass(EatInterface)
最后返回一个有EatInterface模块的BehaviorClass类  
同理 $b_2 $b_3也是这样 */
$b_1 = $container->make('BehaviorClass', ['EatInterface']);  
$b_2 = $container->make('BehaviorClass', ['SleepInterface']);
$b_3 = $container->make('BehaviorClass', ['EatInterface']);
// 调用
echo "<br>";
$b_1->behavior_func();
$b_2->behavior_func();


// ************************************ 最简单最直白的IoC 没有回调***************************************
// 代码来源:https://segmentfault.com/a/1190000007209266
class c  //要注入的类
{
    public function say()
    {
        echo "<br>".'hello';
    }
}

class a   //容器
{
    private $c;
    public function setC(C $c)
    {
        $this->c = $c; // 实例化创建C类
    }

    public function sayC()
    {
        echo $this->c->say(); // 调用C类中的方法
    }
}

$c = new C();
$a = new a();
$a->setC($c);
$a->sayC();
2
0
查看评论

控制反转(IoC)与依赖注入(DI)——自己的理解

昨天的验收,师姐提到了这个词控制反转与依赖注入  ,在我们的七层抽象工厂的模式中似乎用到了这个知识,于是乎自己动手查查到底是什么东西,发现了意想不到的东西,特此来分享一下。 一、概念(百度)         控制反转(Inversion of...
  • tr1912
  • tr1912
  • 2016-05-03 15:03
  • 1371

php设计模式-Ioc(控制反转)和Di(依赖注入)

http://www.thinkphp.cn/topic/12180.html
  • w786572258
  • w786572258
  • 2016-09-24 15:02
  • 2052

轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI)

写这篇文章的原因是这两天在编写关于 Dagger2 主题的博文时,花了大量的精力来解释依赖注入这个概念。后来想一下,这些在面向对象开发过程中与依赖相关的诸多术语和概念实际情况下非常的抽象,因此独立成文也有就一定的意义,旨在帮助初学者快速地对这些概念有一个大致的印象,然后通过一些实例来领悟它们之中的内...
  • briblue
  • briblue
  • 2017-07-13 22:04
  • 7346

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

1.控制反转(Inversion of Control)与依赖注入(Dependency Injection) 控制反转即IoC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象...
  • linghu_java
  • linghu_java
  • 2016-04-21 20:15
  • 1374

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

IOC   inversion of control  控制反转 DI   Dependency Injection  依赖注入 要理解这两个概念,首先要搞清楚以下几个问题: 参与者都有谁?依赖:谁依赖于谁?为什么需要依赖? 注入:谁注入于谁?到...
  • doris_crazy
  • doris_crazy
  • 2014-01-16 11:23
  • 26116

利用反射简单模拟Spring的控制反转(Ioc)和依赖注入(DI)

利用反射简单模拟Spring的控制反转(Ioc)和依赖注入(DI) 1.配置文件(.properties)中配置要扫描的包: #扫描page对象的包 init.pageobj.Package = ec.qa.autotest.ui.admin.portal.pageobject,ec.qa.aut...
  • wangxin1982314
  • wangxin1982314
  • 2015-12-08 17:23
  • 1614

【Spring】Spring的IOC(控制反转)/DI(依赖注入)原理(一):用到“反射”编程

1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。 图1:软件系统中耦合的对象 如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针、分针和秒针顺时针旋转,...
  • cangchen
  • cangchen
  • 2015-04-08 22:25
  • 1865

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

控制反转和依赖注入可以理解成同一个东西,都是为解耦而生的~   控制反转(IoC=Inversion of Control)IoC,用白话来讲,就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:(依赖)控制权由应用代码中转到了...
  • Elite_1989
  • Elite_1989
  • 2013-11-20 22:13
  • 6022

Spring入门--控制反转(IOC)与依赖注入(DI)

1.控制反转(Inversion of Control)与依赖注入(Dependency Injection) 控制反转即IoC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象...
  • hy6688_
  • hy6688_
  • 2014-10-31 18:46
  • 9275

Java面试-Spring IOC(控制反转)和DI(依赖注入)

IOCIoc(Inversion of Control)翻译成中文就是“控制反转”,一个比较晦涩的词语。如果要真正理解这个词语,必须要用过Spring框架才行,因为Spring开启了一种新的编程方式。传统的编程方式: 所有的对象和资源都是由开发人员来控制,由你来决定什么时候new一个对象,什么时候申...
  • u010902721
  • u010902721
  • 2016-10-04 23:18
  • 1408
    个人资料
    • 访问:32829次
    • 积分:536
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:0篇
    • 译文:0篇
    • 评论:30条
    文章分类
    最新评论