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

資訊專欄INFORMATION COLUMN

聊一聊PHP的依賴注入(DI) 和 控制反轉(zhuǎn)(IoC)

sixgo / 580人閱讀

摘要:前言最近在使用框架,看了下他的源碼,發(fā)現(xiàn)有很多地方也用到了依賴注入控制反轉(zhuǎn),覺(jué)得有必要和大家簡(jiǎn)單聊一聊什么是依賴注入以及怎么使用它。概念依賴注入和控制反轉(zhuǎn)是對(duì)同一件事情的不同描述,從某個(gè)方面講,就是它們描述的角度不同。

前言

最近在使用ThinkPHP5框架,看了下他的源碼,發(fā)現(xiàn)有很多地方也用到了依賴注入(控制反轉(zhuǎn)),覺(jué)得有必要和大家簡(jiǎn)單聊一聊什么是依賴注入以及怎么使用它。

簡(jiǎn)介
 IoC - Inversion of Control  控制反轉(zhuǎn)
 DI  - Dependency Injection  依賴注入

依賴注入和控制反轉(zhuǎn)說(shuō)的實(shí)際上是同一個(gè)東西,它們是一種設(shè)計(jì)模式,這種設(shè)計(jì)模式用來(lái)減少程序間的耦合

優(yōu)勢(shì)(為什么使用)

使用依賴注入,最重要的一點(diǎn)好處就是有效的分離了對(duì)象和它所需要的外部資源,使得它們松散耦合,有利于功能復(fù)用,更重要的是使得程序的整個(gè)體系結(jié)構(gòu)變得非常靈活。

概念

依賴注入和控制反轉(zhuǎn)是對(duì)同一件事情的不同描述,從某個(gè)方面講,就是它們描述的角度不同。

依賴注入是從應(yīng)用程序的角度在描述,可以把依賴注入,即:應(yīng)用程序依賴容器創(chuàng)建并注入它所需要的外部資源;

而控制反轉(zhuǎn)是從容器的角度在描述,即:容器控制應(yīng)用程序,由容器反向的向應(yīng)用程序注入應(yīng)用程序所需要的外部資源。

問(wèn)答

對(duì)于一個(gè)菜鳥(niǎo),如果你看了上面的概念還是一頭霧水的話,那么恭喜你,你和我一樣不是天才,那么下面就讓我們借助于幾個(gè)問(wèn)答來(lái)搞清楚這個(gè)概念的意思吧。

問(wèn)題

整個(gè)過(guò)程中參與者都有誰(shuí)?

依賴:誰(shuí)依賴于誰(shuí)?為什么需要依賴?

注入:誰(shuí)注入于誰(shuí)?到底注入了什么?

控制反轉(zhuǎn):誰(shuí)控制誰(shuí)?控制什么?為何叫反轉(zhuǎn)(有反轉(zhuǎn)就應(yīng)該有正轉(zhuǎn)了,正轉(zhuǎn)是什么呢?)

依賴注入和控制反轉(zhuǎn)是同一概念嗎?

回答

整個(gè)過(guò)程中參與者都有誰(shuí)?

   一般有三方參與者,一個(gè)是某個(gè)對(duì)象;一個(gè)是IoC/DI的容器;另一個(gè)是某個(gè)對(duì)象的外部資源。
   某個(gè)對(duì)象指的就是任意的、普通的PHP對(duì)象; 
   IoC/DI的容器簡(jiǎn)單點(diǎn)說(shuō)就是指用來(lái)實(shí)現(xiàn)IoC/DI功能的一個(gè)框架程序;
   對(duì)象的外部資源指的就是對(duì)象需要的,但是是從對(duì)象外部獲取的,都統(tǒng)稱資源,比如:對(duì)象需要的其它對(duì)象、或者是對(duì)象需要的文件資源等等。

誰(shuí)依賴于誰(shuí):

   當(dāng)然是某個(gè)對(duì)象依賴于IoC/DI的容器

為什么需要依賴:

   對(duì)象需要IoC/DI的容器來(lái)提供對(duì)象需要的外部資源

誰(shuí)注入于誰(shuí):

   是IoC/DI的容器 注入 某個(gè)對(duì)象

到底注入什么:

   就是注入某個(gè)對(duì)象所需要的外部資源

誰(shuí)控制誰(shuí):

   當(dāng)然是IoC/DI的容器來(lái)控制對(duì)象了

控制什么:

   主要是控制對(duì)象實(shí)例的創(chuàng)建

為何叫反轉(zhuǎn):

   反轉(zhuǎn)是相對(duì)于正向而言的,那么什么算是正向的呢?
   考慮一下常規(guī)情況下的應(yīng)用程序,如果要在A里面使用C,你會(huì)怎么做呢?當(dāng)然是直接去創(chuàng)建C的對(duì)象,也就是說(shuō),是在A類中主動(dòng)去獲取所需要的外部資源C($c = new C();),這種情況被稱為正向的。那么什么是反向呢?就是A類不再主動(dòng)去獲取C,而是被動(dòng)等待,等待IoC/DI的容器獲取一個(gè)C的實(shí)例,然后反向的注入到A類中。

   用圖例來(lái)說(shuō)明一下,先看沒(méi)有IoC/DI的時(shí)候,常規(guī)的A類使用C類的示意圖,如下圖所示:

代碼示意:

c = new C(); // 實(shí)例化創(chuàng)建C類
    }

    public function sayC()
    {
        echo $this->c->say(); // 調(diào)用C類中的方法
    }
}

$a = new a();
$a->sayC();

當(dāng)有了IoC/DI的容器后,A類不再主動(dòng)去創(chuàng)建C了,如下圖所示:

而是被動(dòng)等待,等待IoC/DI的容器獲取一個(gè)C的實(shí)例,然后反向的注入到A類中,如下圖所示:

代碼示意:

c = $c; // 實(shí)例化創(chuàng)建C類
    }

    public function sayC()
    {
        echo $this->c->say(); // 調(diào)用C類中的方法
    }
}

$c = new C();
$a = new a();
$a->setC($c);
$a->sayC();

9.什么是正轉(zhuǎn)?正轉(zhuǎn)就是按照普通的我們?cè)兕愔兄苯觿?chuàng)建對(duì)象實(shí)例,如 $c = new C();

10.依賴注入和控制反轉(zhuǎn)是同一概念嗎?

    根據(jù)上面的講述,我們不難出來(lái),`依賴注入`和`控制反轉(zhuǎn)`確實(shí)是對(duì)同一件事情的不同描述,從某個(gè)方面講,就是它們描述的`角度`不同。
    
總結(jié)

其實(shí)IoC/DI對(duì)編程帶來(lái)的最大改變不是從代碼上,而是從思想上,發(fā)生了“主從換位”的變化。應(yīng)用程序原本是老大,要獲取什么資源都是主動(dòng)出擊,但是在IoC/DI思想中,應(yīng)用程序就變成被動(dòng)的了,被動(dòng)的等待IoC/DI容器來(lái)創(chuàng)建并注入它所需要的資源了。

注意

我們上面說(shuō)了,這是一種“設(shè)計(jì)模式”,就像“工廠模式”和“單例模式”等是一樣的,它是一種面向?qū)ο笾械木幊獭八枷搿?,自然它也不僅限于PHP,而是所有面向?qū)ο蟮恼Z(yǔ)言基本都是可以適用的。

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

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

相關(guān)文章

  • 搞懂依賴注入, 用 PHP 手寫簡(jiǎn)易 IOC 容器

    摘要:依賴注入控制反轉(zhuǎn)的一種具體實(shí)現(xiàn)方法。接下來(lái),我們使用依賴注入實(shí)現(xiàn)控制反轉(zhuǎn),使依賴關(guān)系倒置依賴被動(dòng)傳入。從單元測(cè)試的角度看,依賴注入更方便和操作,方便了測(cè)試人員寫出質(zhì)量更高的測(cè)試代碼。 前言 好的設(shè)計(jì)會(huì)提高程序的可復(fù)用性和可維護(hù)性,也間接的提高了開(kāi)發(fā)人員的生產(chǎn)力。今天,我們就來(lái)說(shuō)一下在很多框架中都使用的依賴注入。 一些概念 要搞清楚什么是依賴注入如何依賴注入,首先我們要明確一些概念。 D...

    antz 評(píng)論0 收藏0
  • Yii2中依賴注入

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

    harriszh 評(píng)論0 收藏0
  • php實(shí)現(xiàn)依賴注入(DI)控制反轉(zhuǎn)IOC)

    摘要:工廠模式,依賴轉(zhuǎn)移當(dāng)然,實(shí)現(xiàn)控制反轉(zhuǎn)的方法有幾種。其實(shí)我們稍微改造一下這個(gè)類,你就明白,工廠類的真正意義和價(jià)值了。雖然如此,工廠模式依舊十分優(yōu)秀,并且適用于絕大多數(shù)情況。 此篇文章轉(zhuǎn)載自laravel-china,chongyi的文章https://laravel-china.org/top...原文地址: http://www.insp.top/learn-lar... ,轉(zhuǎn)載務(wù)必保...

    tomato 評(píng)論0 收藏0
  • 深入理解控制反轉(zhuǎn)IoC依賴注入DI

    摘要:本文一大半內(nèi)容都是通過(guò)舉例來(lái)讓讀者去理解什么是控制反轉(zhuǎn)和依賴注入,通過(guò)理解這些概念,來(lái)更加深入。這種由外部負(fù)責(zé)其依賴需求的行為,我們可以稱其為控制反轉(zhuǎn)。工廠模式,依賴轉(zhuǎn)移當(dāng)然,實(shí)現(xiàn)控制反轉(zhuǎn)的方法有幾種。 容器,字面上理解就是裝東西的東西。常見(jiàn)的變量、對(duì)象屬性等都可以算是容器。一個(gè)容器能夠裝什么,全部取決于你對(duì)該容器的定義。當(dāng)然,有這樣一種容器,它存放的不是文本、數(shù)值,而是對(duì)象、對(duì)象的描...

    HollisChuang 評(píng)論0 收藏0
  • Spring還可以這么學(xué)--IoC(控制反轉(zhuǎn)) / DI(依賴注入)理解

    摘要:對(duì)象之間耦合度過(guò)高的系統(tǒng),必然會(huì)出現(xiàn)牽一發(fā)而動(dòng)全身的情形。控制被反轉(zhuǎn)之后,獲得依賴對(duì)象的過(guò)程由自身管理變?yōu)榱擞扇萜髦鲃?dòng)注入。于是,他給控制反轉(zhuǎn)取了一個(gè)更合適的名字叫做依賴注入。 Spring還可以這么學(xué)--IoC(控制反轉(zhuǎn)) / DI(依賴注入)理解 聲明:文章的前三部分參考博文:https://www.cnblogs.com/Nouno...這篇文章首發(fā)是在我的個(gè)人微信訂閱號(hào)每天學(xué)編...

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

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

0條評(píng)論

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