美文网首页
Ioc容器实现

Ioc容器实现

作者: 谁的忧伤 | 来源:发表于2018-08-23 11:19 被阅读0次

看了篇讲解laravel Ioc容器的文章,自己照着文章实践了下,注释部分是自己的理解

interface SuperModuleInterface{
    public function activate();
}

class XPower implements SuperModuleInterface {
    
    protected $range;
    protected $cd;
    
    public function __construct($range=0,$cd=0) {
        $this->range = $range;
        $this->cd = $cd;
    }
    
    public function activate(){ print_r($this);}
}

class Fly implements SuperModuleInterface {
  
    protected $height;
    protected $times;
    
    public function __construct($height=0,$times=0) {
        $this->height = $height;
        $this->times = $times;
    }
    
    public function activate(){ print_r($this);}
}

class SuperModuleFactory{
    public function makeModule($moduleName,$options){
        switch($moduleName){
            case 'fly': return new Fly($options[0],$options[1]);
            case 'xpower': return new XPower($options[0],$options[1]);
        }
    }
}


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,$parmeters=[]){
        if(isset($this->instances[$abstract])){
            return $this->instances[$abstract];
        }
        
        array_unshift($parmeters,$this);
        
        #调用回调函数,并把自身作为第一个参数传入
        return call_user_func_array($this->binds[$abstract],$parmeters);
        
    }
    
}

class Superman{

    protected $power;
    
    /**
     * 第三代构造器-依赖注入
     * @param SuperModuleInterface $module 超能力模块
     */
    public function __construct(SuperModuleInterface $module) {
        $this->power=$module;
    }
    
    /**
     * 第二代构造器-依赖工厂
     * @param $modules
     */
    //public function __construct($modules) {
    //    $factory=new SuperModuleFactory();
    //    foreach($modules as $moduleName =>$options){
    //        $this->power[]=$factory->makeModule($moduleName,$options);
    //    }
    //
    //}
    
    /**
     * 第一代构造器-依赖具体实现类
     */
    //public function __construct() {
    //    $this->power[]=new XPower(100,11);
    //    $this->power[]=new Fly(10000,3600);
    //}
    
    public function attack(){
        $powers=is_array($this->power)?$this->power:array($this->power);
        foreach($powers as $p){
            $p->activate();
        }
    }
}

$container=new Container();

#此处这个写保证每次注入的都是一个新的对象
#如果写成    $container->bind('XPower',new XPower());
#那么每次注入的都将是同一个对象,即注入的对象在各个实例中共享[传参是对象时传递的是引用,不是复制]
$container->bind('XPower',function($container,$range,$cd){
    return new XPower($range,$cd);
});

$container->bind('Fly',function($container,$height,$times){
    return new Fly($height,$times);
});

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

$superman_1=$container->make('Superman',['XPower',1,2]);
$superman_2=$container->make('Superman',['Fly',5,6]);

echo '<pre>';
$superman_1->attack();
echo PHP_EOL;
$superman_2->attack();

执行结果:

XPower Object
(
    [range:protected] => 1
    [cd:protected] => 2
)

Fly Object
(
    [height:protected] => 5
    [times:protected] => 6
)

相关文章

  • 2018-06-08

    IOC 容器 IOC容器和beans Spring实现了IOC (Inversion of Control)(控制...

  • 一、Spring核心篇

    第2章Spring Framework的核心:IoC容器的实现 2.1Spring IoC容器概述 1.IOC容器...

  • 简单的 IOC

    简单的 IOC 先从简单的 IOC 容器实现开始,最简单的 IOC 容器只需4步即可实现,如下: 加载 xml 配...

  • spring ioc原理学习总结

    IOC容器的设计与实现 IoC容器设计中,两个主要的接口 1)BeanFactory:可以理解为IoC容器的抽象,...

  • Spring学习手册(3)—— bean实例化配置

    Spring学习手册(2)—— IOC容器介绍了IOC概念以及Spring关于IOC容器的实现方式,最后概述了Sp...

  • Spring框架one

    一、IoC模式 系统中通过引入实现了IoC模式的IoC容器,即可由IoC容器来管理对象的生命周期、依赖关系等,从而...

  • (系列5)JAVA框架

    框架 Spring IoC⭐ IoC IoC 控制反转,把对象创建、依赖反转给容器实现,需要创建一个容器和一种描述...

  • xml方式自定义实现Ioc容器

    @[TOC] xml方式自定义实现Ioc容器 使用xml实现自定义简单的Ioc容器 前言 平时开发过程中,我们都是...

  • Spring:Ioc容器中Bean生命周期

    容器的实现是通过Ioc管理Bean的生命周期来实现的。Spring Ioc容器在对Bean的生命周期进行管理时提供...

  • 13--BeanFactory简介

    前两篇已经简介了Spring及其IoC容器,本篇介绍IoC容器最基础的实现BeanFactory,其XmlBean...

网友评论

      本文标题:Ioc容器实现

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