美文网首页
ioc-控制反转

ioc-控制反转

作者: yaokui | 来源:发表于2016-02-19 15:02 被阅读61次
    //超能力接口
    interface SuperModuleInterface
    {
        /**
         * 超能力激活方法
         *
         * 任何一个超能力都得有该方法,并拥有一个参数
         *@param array $target 针对目标,可以是一个或多个,自己或他人
         */
        public function activate(array $target);
    }
    
    //超人类
    class Superman
    {
        protected $module;
    
        public function __construct(SuperModuleInterface $module)
        {
            $this->module = $module;
        }
    }
    
    /**
     * X-超能量
     */
    class XPower implements SuperModuleInterface
    {
        public function activate(array $target)
        {
            echo 'XPower';
        }
    }
    
    /**
     * 终极炸弹 (就这么俗)
     */
    class UltraBomb implements SuperModuleInterface
    {
        public function activate(array $target)
        {
            echo 'UltraBomb';
        }
    }
    
    /**
     * ioc容器
     * Class Container
     */
    class Container
    {
        protected $binds;
    
        protected $instances;
    
        public function bind($abstract, $concrete)
        {
            //是否是闭包
            if ($concrete instanceof Closure) {
                $this->binds[$abstract] = $concrete;
            } else {
                $this->instances[$abstract] = $concrete;
            }
        }
    
        public function make($abstract, array $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']);
    $superman_2 = $container->make('superman', ['ultrabomb']);
    $superman_3 = $container->make('superman', ['xpower']);
    // ...随意添加
    

    相关文章

      网友评论

          本文标题:ioc-控制反转

          本文链接:https://www.haomeiwen.com/subject/hwcvkttx.html