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

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

原文 http://blog.csdn.net/chWow/article/details/79171678

2018-01-27 02:00:22阅读(358)

<?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();

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹