Ioc容器實現(xiàn)

看了篇講解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);
        
        #調(diào)用回調(diào)函數(shù)方面,并把自身作為第一個參數(shù)傳入
        return call_user_func_array($this->binds[$abstract],$parmeters);
        
    }
    
}

class Superman{

    protected $power;
    
    /**
     * 第三代構(gòu)造器-依賴注入
     * @param SuperModuleInterface $module 超能力模塊
     */
    public function __construct(SuperModuleInterface $module) {
        $this->power=$module;
    }
    
    /**
     * 第二代構(gòu)造器-依賴工廠
     * @param $modules
     */
    //public function __construct($modules) {
    //    $factory=new SuperModuleFactory();
    //    foreach($modules as $moduleName =>$options){
    //        $this->power[]=$factory->makeModule($moduleName,$options);
    //    }
    //
    //}
    
    /**
     * 第一代構(gòu)造器-依賴具體實現(xiàn)類
     */
    //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());
#那么每次注入的都將是同一個對象仿耽,即注入的對象在各個實例中共享[傳參是對象時傳遞的是引用眯搭,不是復(fù)制]
$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();

執(zhí)行結(jié)果:

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

Fly Object
(
    [height:protected] => 5
    [times:protected] => 6
)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窥翩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鳞仙,更是在濱河造成了極大的恐慌寇蚊,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棍好,死亡現(xiàn)場離奇詭異幔荒,居然都是意外死亡,警方通過查閱死者的電腦和手機梳玫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門爹梁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人提澎,你說我怎么就攤上這事姚垃。” “怎么了盼忌?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵积糯,是天一觀的道長。 經(jīng)常有香客問我谦纱,道長看成,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任跨嘉,我火速辦了婚禮川慌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘祠乃。我一直安慰自己梦重,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布亮瓷。 她就那樣靜靜地躺著琴拧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嘱支。 梳的紋絲不亂的頭發(fā)上蚓胸,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天挣饥,我揣著相機與錄音,去河邊找鬼沛膳。 笑死亮靴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的于置。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼贞岭,長吁一口氣:“原來是場噩夢啊……” “哼八毯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瞄桨,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤话速,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后芯侥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泊交,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年柱查,在試婚紗的時候發(fā)現(xiàn)自己被綠了廓俭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡唉工,死狀恐怖研乒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情淋硝,我是刑警寧澤雹熬,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站谣膳,受9級特大地震影響竿报,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜继谚,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一烈菌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧花履,春花似錦僧界、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至欢峰,卻和暖如春葬荷,著一層夾襖步出監(jiān)牢的瞬間涨共,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工宠漩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留举反,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓扒吁,卻偏偏與公主長得像火鼻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子雕崩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容