PHP 依赖注入(DI)和控制反转(IoC)简单理解
<?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();
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chWow/article/details/79171678
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭