最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

php控制反轉(zhuǎn)與依賴注入舉例講解

 更新時(shí)間:2022年11月17日 09:28:02   作者:Lambert-XG  
IOC-Inversion of Control,即控制反轉(zhuǎn)。它不是什么技術(shù),而是一種設(shè)計(jì)思想。這篇文章主要介紹了php控制反轉(zhuǎn)與依賴注入的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

耦合

兩個(gè)或以上的體系或兩種運(yùn)動(dòng)形式間相互作用而彼此影響以至于聯(lián)合起來的現(xiàn)象。在軟件工程中,對象之間的耦合度就是對象之間的依賴性,對象之間的耦合越高,維護(hù)成本就越大。

小明和他的手機(jī)

從前有個(gè)人叫小明

小明有三大愛好,抽煙,喝酒…… 咳咳,不好意思,走錯(cuò)片場了。應(yīng)該是逛知乎、玩王者農(nóng)藥和搶微信紅包

我們用一段簡單的偽代碼,來制造一個(gè)這樣的小明

class Ming extends Person
{
    private $_name;
    private $_age;
    function read()
    {
        //逛知乎
    }
    function  play()
    {
        //玩農(nóng)藥
    }
    function  grab()
    {
        //搶紅包
    }
}

但是,小明作為一個(gè)人類,沒有辦法僅靠自己就能實(shí)現(xiàn)以上的功能,他必須依賴一部手機(jī),所以他買了一臺iphone6,接下來我們來制造一個(gè)iphone6

class iPhone6 extends Iphone
{
    function read($user="某人")
    {
        echo $user."打開了知乎然后編了一個(gè)故事 \n";
    }
    function play($user="某人")
    {
        echo $user."打開了王者農(nóng)藥并送起了人頭 \n";
    }
    function grab($user="某人")
    {
        echo $user."開始搶紅包卻只搶不發(fā) \n";
    }
}

小明非常珍惜自己的新手機(jī),每天把它牢牢控制在手心里,所以小明變成了這個(gè)樣子

class Ming extends Person
{
    private $_name;
    private $_age;
    public function  __construct()
    {
        $this->_name = '小明';
        $this->_age = 26;
    }
    function read()
    {
        //……  省略若干代碼
        (new iPhone6())->read($this->_name); //逛知乎
    }
    function  play()
    {
        //……  省略若干代碼
        (new iPhone6())->play($this->_name);//玩農(nóng)藥
    }
    function  grab()
    {
        //……  省略若干代碼
        (new iPhone6())->grab($this->_name);//搶紅包
    }
}

今天是周六,小明不用上班,于是他起床,并依次逛起了知乎,玩王者農(nóng)藥,并搶了個(gè)紅包。

$ming = new Ming();  //小明起床
$ming->read();
$ming->play();
$ming->grab();

這個(gè)時(shí)候,我們可以在命令行里看到輸出如下

小明打開了知乎然后編了一個(gè)故事 
小明打開了王者農(nóng)藥并送起了人頭 
小明開始搶紅包卻只搶不發(fā)

這一天,小明過得很充實(shí),他覺得自己是世界上最幸福的人。

小明的快樂與憂傷

小明和他的手機(jī)曾一起度過了一段美好的時(shí)光,一到空閑時(shí)刻,他就抱著手機(jī),逛知乎,刷微博,玩游戲,他覺得自己根本不需要女朋友,只要有手機(jī)在身邊,就滿足了。

可誰能想到,一次次地系統(tǒng)更新徹底打碎了他的夢想,他的手機(jī)變得越來越卡頓,電池的使用壽命也越來越短,一直到某一天的寒風(fēng)中,他的手機(jī)終于耐不住寒冷,頭也不回地關(guān)了機(jī)。

小明很憂傷,他意識到,自己要換手機(jī)了。

為了能獲得更好的使用體驗(yàn),小明一咬牙,剁手了一臺iphoneX,這部手機(jī)鈴聲很大,電量很足,還能雙卡雙待,小明很喜歡,但是他遇到一個(gè)問題,就是他之前過度依賴了原來那一部iPhone6,他們之間已經(jīng)深深耦合在一起了,如果要換手機(jī),他就要拿起刀來改造自己,把自己體內(nèi)所有方法中的iphone6 都換成 iphoneX。

經(jīng)歷了漫長的改造過程,小明終于把代碼中的 iphone6 全部換成了 iphoneX。雖然很辛苦,但是小明覺得他是快樂的。

于是小明開開心心地帶著手機(jī)去上班了,并在回來的路上被小偷偷走了。為了應(yīng)急,小明只好重新使用那部剛剛被遺棄的iphone6,但是一想到那漫長的改造過程,小明的心里就說不出的委屈,他覺得自己過于依賴手機(jī)了,為什么每次手機(jī)出什么問題他都要去改造他自己,這不僅僅是過度耦合,簡直是本末倒置,他向天空大喊,我不要再控制我的手機(jī)了。

天空中的造物主,也就是作為程序員的我,聽到了他的吶喊,我告訴他,你不用再控制你的手機(jī)了,交給我來管理,把控制權(quán)交給我。這就叫做控制反轉(zhuǎn)。

造物主的智慧

小明聽到了我的話,他既高興,又有一點(diǎn)害怕,他跪下來磕了幾個(gè)頭,虔誠地說到:“原來您就是傳說中的造物主,巴格梅克上神。我聽到您剛剛說了 控制反轉(zhuǎn) 四個(gè)字,就是把手機(jī)的控制權(quán)從我的手里交給你,但這只是您的想法,是一種思想罷了,要用什么辦法才能實(shí)現(xiàn)控制反轉(zhuǎn),又可以讓我繼續(xù)使用手機(jī)呢?”

“呵“,身為造物主的我在表現(xiàn)完不屑以后,扔下了四個(gè)大字,“依賴注入!”

接下來,偉大的我開始對小明進(jìn)行慘無人道的改造,如下

class Ming extends Person
{
    private $_name;
    private $_age;
    private $_phone; //將手機(jī)作為自己的成員變量
    public function  __construct($phone)
    {
        $this->_name = '小明';
        $this->_age = 26;
        $this->_phone = $phone;
        echo "小明起床了 \n";
    }
    function read()
    {
        //……  省略若干代碼
        $this->_phone->read($this->_name); //逛知乎
    }
    function  play()
    {
        //……  省略若干代碼
        $this->_phone->play($this->_name);//玩農(nóng)藥

    }
    function  grab()
    {
        //……  省略若干代碼
        $this->_phone->grab($this->_name);//搶紅包
    }
}

接下來,我們來模擬運(yùn)行小明的一天

$phone = new IphoneX(); //創(chuàng)建一個(gè)iphoneX的實(shí)例
if($phone->isBroken()){//如果iphone不可用,則使用舊版手機(jī)
    $phone = new Iphone6();
}
$ming = new Ming($phone);//小明不用關(guān)心是什么手機(jī),他只要玩就行了。
$ming->read();
$ming->play();
$ming->grab();

我們先看一下iphoneX 是否可以使用,如果不可以使用,則直接換成iphone6,然后喚醒小明,并把手機(jī)塞到他的手里,換句話說,把他所依賴的手機(jī)直接注入到他的身上,他不需要關(guān)心自己拿的是什么手機(jī),他只要直接使用就可以了。

這就是依賴注入。

小明的感悟

小明的生活開始變得簡單了起來,而他把省出來的時(shí)間都用來寫筆記了,他在筆記本上這樣寫到

我曾經(jīng)有很強(qiáng)的控制欲,過度依賴于我的手機(jī),導(dǎo)致我和手機(jī)之間耦合程度太高,只要手機(jī)出現(xiàn)一點(diǎn)點(diǎn)問題,我都要改造我自己,這實(shí)在是既浪費(fèi)時(shí)間又容易出問題。自從我把控制權(quán)交給了造物主,他每天在喚醒我以前,就已經(jīng)替我選好了手機(jī),我只要按照平時(shí)一樣玩手機(jī)就可以了,根本不用關(guān)心是什么手機(jī)。即便手機(jī)出了問題,也可以由造物主直接搞定,不需要再改造我自己了,我現(xiàn)在買了七部手機(jī),都交給了造物主,每天換一部,美滋滋!

我也從其中獲得了這樣的感悟: 如果一個(gè)類A 的功能實(shí)現(xiàn)需要借助于類B,那么就稱類B是類A的依賴,如果在類A的內(nèi)部去實(shí)例化類B,那么兩者之間會(huì)出現(xiàn)較高的耦合,一旦類B出現(xiàn)了問題,類A也需要進(jìn)行改造,如果這樣的情況較多,每個(gè)類之間都有很多依賴,那么就會(huì)出現(xiàn)牽一發(fā)而動(dòng)全身的情況,程序會(huì)極難維護(hù),并且很容易出現(xiàn)問題。要解決這個(gè)問題,就要把A類對B類的控制權(quán)抽離出來,交給一個(gè)第三方去做,把控制權(quán)反轉(zhuǎn)給第三方,就稱作控制反轉(zhuǎn)(IOC Inversion Of Control)。控制反轉(zhuǎn)是一種思想,是能夠解決問題的一種可能的結(jié)果,而依賴注入(Dependency Injection)就是其最典型的實(shí)現(xiàn)方法。由第三方(我們稱作IOC容器)來控制依賴,把他通過構(gòu)造函數(shù)、屬性或者工廠模式等方法,注入到類A內(nèi),這樣就極大程度的對類A和類B進(jìn)行了解耦。

到此這篇關(guān)于php控制反轉(zhuǎn)與依賴注入舉例講解的文章就介紹到這了,更多相關(guān)php控制反轉(zhuǎn)與依賴注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 談?wù)凱HP的輸入輸出流

    談?wù)凱HP的輸入輸出流

    談?wù)凱HP的輸入輸出流...
    2007-02-02
  • php 計(jì)算兩個(gè)時(shí)間戳相隔的時(shí)間的函數(shù)(小時(shí))

    php 計(jì)算兩個(gè)時(shí)間戳相隔的時(shí)間的函數(shù)(小時(shí))

    計(jì)算兩個(gè)時(shí)間戳相隔的時(shí)間,以前腳本之家發(fā)布過具體到天數(shù)的,這個(gè)可以具體到小時(shí)數(shù),需要的朋友可以參考下。
    2009-12-12
  • php實(shí)現(xiàn)登陸模塊功能示例

    php實(shí)現(xiàn)登陸模塊功能示例

    這篇文章主要介紹了php實(shí)現(xiàn)登陸模塊的方法,結(jié)合實(shí)例形式分析了php實(shí)現(xiàn)登陸功能的步驟與相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-10-10
  • php中session_unset與session_destroy的區(qū)別分析

    php中session_unset與session_destroy的區(qū)別分析

    關(guān)于session_unset()和session_destroy()的函數(shù)使用進(jìn)行介紹。學(xué)習(xí)php的朋友可以參考下。
    2011-06-06
  • Laravel中數(shù)據(jù)庫遷移操作的示例詳解

    Laravel中數(shù)據(jù)庫遷移操作的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Laravel實(shí)現(xiàn)數(shù)據(jù)庫遷移操作的相關(guān)知識,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-02-02
  • 如何使用SublimeText3配置 PHP IDE環(huán)境

    如何使用SublimeText3配置 PHP IDE環(huán)境

    這篇文章主要介紹了如何使用SublimeText3配置 PHP IDE環(huán)境,并使用Xdebug進(jìn)行調(diào)試,喜歡使用SublimeText的同學(xué),可以參考下
    2021-04-04
  • 處理單名多值表單的詳解

    處理單名多值表單的詳解

    本篇文章是對處理單名多值表單進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • phpstudy?mysql啟動(dòng)后停止的解決方案

    phpstudy?mysql啟動(dòng)后停止的解決方案

    今天mysql突然無法啟動(dòng)了,所以解決下,這篇文章主要給大家介紹了關(guān)于phpstudy?mysql啟動(dòng)后停止的解決方案,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-08-08
  • PHP實(shí)現(xiàn)的pdo連接數(shù)據(jù)庫并插入數(shù)據(jù)功能簡單示例

    PHP實(shí)現(xiàn)的pdo連接數(shù)據(jù)庫并插入數(shù)據(jù)功能簡單示例

    這篇文章主要介紹了PHP實(shí)現(xiàn)的pdo連接數(shù)據(jù)庫并插入數(shù)據(jù)功能,結(jié)合簡單示例形式分析了pdo數(shù)據(jù)庫連接及執(zhí)行基本的插入SQL語句相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • php at(@)符號的用法簡介

    php at(@)符號的用法簡介

    對于php的初學(xué)者,經(jīng)常會(huì)看到在一個(gè)函數(shù)名字前面有一個(gè)at(@)符號,但是不知道它的作用和用法,去掉后好像對程序沒有什么影響,感到很困惑,簡單的說@可以忽略錯(cuò)誤,有仰制錯(cuò)誤的功能為錯(cuò)誤控制操作符.
    2009-07-07

最新評論

葫芦岛市| 沭阳县| 明水县| 庆阳市| 鲁甸县| 芦溪县| 海盐县| 阿瓦提县| 全椒县| 茶陵县| 循化| 孟连| 桐庐县| 和林格尔县| 福贡县| 安宁市| 老河口市| 乐都县| 庆阳市| 社旗县| 汕尾市| 新乡县| 新蔡县| 金乡县| 萝北县| 洛浦县| 婺源县| 巴林左旗| 历史| 曲阜市| 大港区| 平果县| 平定县| 昌都县| 玉环县| 新野县| 峨眉山市| 鹰潭市| 太康县| 蓝山县| 密云县|