成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

PHP中的服務(wù)容器與依賴(lài)注入的思想

jas0n / 1259人閱讀

摘要:在方法中需要傳入一個(gè)我們可以傳入一個(gè)實(shí)例對(duì)象或者是一個(gè)閉包函數(shù)??梢钥吹轿疫@全使用的是閉包函數(shù),其實(shí)也可以這樣寫(xiě)后面這種寫(xiě)法與閉包相比的區(qū)別就是我們需要先實(shí)例化對(duì)象才能往容易中綁定服務(wù)。

依賴(lài)注入
當(dāng)A類(lèi)需要依賴(lài)于B類(lèi),也就是說(shuō)需要在A(yíng)類(lèi)中實(shí)例化B類(lèi)的對(duì)象來(lái)使用時(shí)候,如果B類(lèi)中的功能發(fā)生改變,也會(huì)導(dǎo)致A類(lèi)中使用B類(lèi)的地方也要跟著修改,導(dǎo)致A類(lèi)與B類(lèi)高耦合。這個(gè)時(shí)候解決方式是,A類(lèi)應(yīng)該去依賴(lài)B類(lèi)的接口,把具體的類(lèi)的實(shí)例化交給外部。

就拿我們業(yè)務(wù)中常用的通知模塊來(lái)說(shuō)。

messager = new Message();

    }

    public function seed_msg()
    {

        return $this->messager->seed();

    }
}
$Order = new Order();
$Order->seed_msg();

上面的代碼是我們傳統(tǒng)的寫(xiě)法。首先由個(gè)消息發(fā)送的類(lèi)。然后在我們需要發(fā)送消息的地方,調(diào)用發(fā)送消息的接口。有一天你需要添加一個(gè)發(fā)送短信的接口以滿(mǎn)足不同的需求。那么你會(huì)發(fā)現(xiàn)你要再Message類(lèi)里面做修改。同樣也要再Order類(lèi)里面做修改。這樣就顯得很麻煩。這個(gè)時(shí)候就有了依賴(lài)注入的思路。下面把代碼做一個(gè)調(diào)整

messager = $message;

    }
    public function seed_msg()
    {
        return $this->messager->seed();
    }
}
//我們需要發(fā)送郵件的時(shí)候
$message = new SeedEmail();
//將郵件發(fā)送對(duì)象作為參數(shù)傳遞給Order
$Order = new Order($message);
$Order->seed_msg();


//我們需要發(fā)送短信的時(shí)候
$message = new SeedSMS();
$Order = new Order($message);
$Order->seed_msg();

這樣我們就實(shí)現(xiàn)了依賴(lài)注入的思路,是不是很方便擴(kuò)展了。

服務(wù)容器
我理解的服務(wù)容器就是一個(gè)自動(dòng)產(chǎn)生類(lèi)的工廠(chǎng)。
binds[$abstract] = $concrete;
        } else {
            $this->instances[$abstract] = $concrete;
        }
    }

    public function make($abstract, $parameters = [])
    {
        if (isset($this->instances[$abstract])) {
            return $this->instances[$abstract];
        }

        array_unshift($parameters, $this);

        return call_user_func_array($this->binds[$abstract], $parameters);
    }
}

//創(chuàng)建一個(gè)消息工廠(chǎng)
$message = new  Container();
//將發(fā)送短信注冊(cè)綁定到工廠(chǎng)里面
$message->bind("SMS",function (){
     return   new  SeedSMS();
});
//將發(fā)送郵件注冊(cè)綁定到工廠(chǎng)
$message->bind("EMAIL",function (){
   return new  SeedEmail();
});
//需要發(fā)送短信的時(shí)候
$SMS  = $message->make("SMS");
$SMS->seed();

container是一個(gè)簡(jiǎn)單的服務(wù)容器里面有bind,make兩個(gè)方法
bind是向容器中綁定服務(wù)對(duì)象。make則是從容器中取出對(duì)象。

bind

bind方法中需要傳入一個(gè) concrete 我們可以傳入一個(gè)實(shí)例對(duì)象或者是一個(gè)閉包函數(shù)。
可以看到我這全使用的是閉包函數(shù),其實(shí)也可以這樣寫(xiě)

$sms = new  SeedSMS();
$message->bind("SMS",$sms);

后面這種寫(xiě)法與閉包相比的區(qū)別就是我們需要先實(shí)例化對(duì)象才能往容易中綁定服務(wù)。而閉包則是我們使用這個(gè)服務(wù)的時(shí)候才去實(shí)例化對(duì)象。可以看出閉包是有很多的優(yōu)勢(shì)的。

make

make方法就從容器中出去方法。里面首先判斷了instances變量中是否有當(dāng)前以及存在的服務(wù)對(duì)象,如果有直接返回。如果沒(méi)有那么會(huì)通過(guò) call_user_func_array返回一個(gè)對(duì)象。call_user_func_array的使用可以查看
PHP 中 call_user_func 的使用

原文地址

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28945.html

相關(guān)文章

  • 【modernPHP專(zhuān)題(3)】依賴(lài)注入服務(wù)容器

    摘要:而依賴(lài)倒置原則的思想是,上層不應(yīng)該依賴(lài)下層,應(yīng)依賴(lài)接口。上面通過(guò)構(gòu)造函數(shù)注入對(duì)象的方式,就是最簡(jiǎn)單的依賴(lài)注入當(dāng)然注入不僅可以通過(guò)構(gòu)造函數(shù)注入,也可以通過(guò)屬性注入,上面你可以通過(guò)一個(gè)來(lái)動(dòng)態(tài)為這個(gè)屬性賦值。 依賴(lài)倒置和控制反轉(zhuǎn)是一種編程思想,而依賴(lài)注入就是通過(guò)服務(wù)容器實(shí)現(xiàn)這種面向接口或者是面向抽象編程的思想 概念理解 依賴(lài)倒置原則 依賴(lài)倒置是一種軟件設(shè)計(jì)思想,在傳統(tǒng)軟件中,上層代碼依賴(lài)于下...

    terro 評(píng)論0 收藏0
  • PHP程序員如何理解IoC/DI

    摘要:依賴(lài)注入容器管理應(yīng)用程序中的全局對(duì)象包括實(shí)例化處理依賴(lài)關(guān)系。為了解決這樣的問(wèn)題,我們?cè)俅位氐饺肿?cè)表創(chuàng)建組件。參考文章程序員如何理解依賴(lài)注入容器補(bǔ)充很多代碼背后,都是某種哲學(xué)思想的體現(xiàn)。 思想 思想是解決問(wèn)題的根本思想必須轉(zhuǎn)換成習(xí)慣構(gòu)建一套完整的思想體系是開(kāi)發(fā)能力成熟的標(biāo)志——《簡(jiǎn)單之美》(前言) . 成功的軟件項(xiàng)目就是那些提交產(chǎn)物達(dá)到或超出客戶(hù)的預(yù)期的項(xiàng)目,而且開(kāi)發(fā)過(guò)程符合時(shí)間和費(fèi)...

    DataPipeline 評(píng)論0 收藏0
  • Laravel核心概念

    摘要:可以為服務(wù)提供者的方法設(shè)置類(lèi)型提示。方法將在所有其他服務(wù)提供者均已注冊(cè)之后調(diào)用。所有服務(wù)提供者都在配置文件中注冊(cè)??梢赃x擇推遲服務(wù)提供者的注冊(cè),直到真正需要注冊(cè)綁定時(shí),這樣可以提供應(yīng)用程序的性能。 本文最早發(fā)布于 Rootrl的Blog 導(dǎo)言 Laravel是一款先進(jìn)的現(xiàn)代化框架,里面有一些概念非常重要。在上手Laravel之前,我認(rèn)為先弄懂這些概念是很有必要的。你甚至需要重溫下PHP...

    ddongjian0000 評(píng)論0 收藏0
  • Laravel 服務(wù)容器實(shí)現(xiàn)原理

    摘要:框架中就是使用服務(wù)容器來(lái)實(shí)現(xiàn)控制反轉(zhuǎn)和依賴(lài)注入。容器依賴(lài)注入的實(shí)現(xiàn)實(shí)現(xiàn)原理需要了解的知識(shí)點(diǎn)閉包匿名函數(shù)匿名函數(shù),也叫閉包函數(shù),允許臨時(shí)創(chuàng)建一個(gè)沒(méi)有指定名稱(chēng)的函數(shù)反射以上版本具有完整的反射,添加了對(duì)類(lèi)接口函數(shù)方法和擴(kuò)展進(jìn)行反向工程的能力。 前言 通過(guò)實(shí)現(xiàn)laravel 框架功能,以便深入理解laravel框架的先進(jìn)思想。 什么是服務(wù)容器 服務(wù)容器是用來(lái)管理類(lèi)依賴(lài)與運(yùn)行依賴(lài)注入的工具。La...

    wupengyu 評(píng)論0 收藏0
  • Yii2依賴(lài)注入

    摘要:構(gòu)造器注入實(shí)現(xiàn)特定參數(shù)的構(gòu)造函數(shù),在新建對(duì)象時(shí)傳入所依賴(lài)類(lèi)型的對(duì)象。 基本概念 1.依賴(lài)倒置(反轉(zhuǎn))原則(DIP):一種軟件架構(gòu)設(shè)計(jì)的原則(抽象概念,是一種思想)在面向?qū)ο缶幊填I(lǐng)域中,依賴(lài)反轉(zhuǎn)原則(Dependency inversion principle,DIP)是指一種特定的解耦(傳統(tǒng)的依賴(lài)關(guān)系創(chuàng)建在高層次上,而具體的策略設(shè)置則應(yīng)用在低層次的模塊上)形式,使得高層次的模塊不依賴(lài)于...

    harriszh 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<