看到網(wǎng)絡(luò)上很多“依賴注入”解釋的話題,這篇博客呢也只是我自己的觀點(diǎn),如果你有不同的觀點(diǎn)請(qǐng)拍磚表窘,不用客氣。
業(yè)務(wù)場(chǎng)景
小明要去旅游甜滨,但是還未確定以什么方式出游乐严,有可能是徒步旅行,也有可能是自駕游衣摩。
代碼演示
根據(jù)步行和駕車的速度來(lái)考慮距離旅游目的地的路程昂验,所以這里定義了兩個(gè)屬性$speed和$distance。所有有了如下代碼:
interfacetravelInterface{publicfunction__construct($speed,$distance);publicfunctionrun();
}abstractclasstravelimplementstravelInterface{protected$speed;//最高時(shí)速protected$distance;//最遠(yuǎn)路程publicfunction__construct($speed,$distance)
{$this->speed =$speed;$this->distance =$distance;
}
}classdriveextendstravel{publicfunctionrun()
{echo"自駕游";
}
}classwalkextendstravel{publicfunctionrun()
{echo"徒步旅行";
}
}
那么艾扮,如果需要換一種出行方式的時(shí)候既琴,則需要修改human類。這里看起來(lái)修改非常簡(jiǎn)單泡嘴,但是我們實(shí)際項(xiàng)目中可能會(huì)夾雜著很多的業(yè)務(wù)邏輯一起修改甫恩。
就說(shuō)下依賴注入的基礎(chǔ)方式
classhuman
{protected$travel;//出行方式publicfunction__construct()
{$this->travel =newdrive(60,1000);
}publicfunctiontraveling(){$this->travel->run();
}
}$xiaoming=newhuman();$xiaoming->traveling();
什么是依賴注入。
簡(jiǎn)單的說(shuō):在A類中使用了B類的實(shí)例時(shí)酌予,B對(duì)象的構(gòu)造不是在A類某個(gè)方法中初始化的磺箕,而是在A類外部初始化之后以B類的對(duì)象傳入進(jìn)來(lái)。這個(gè)過(guò)程就是依賴注入抛虫。
換一種通過(guò)配置文件來(lái)實(shí)現(xiàn)控制反轉(zhuǎn)
classhuman
{protected$travel;//出行方式publicfunction__construct(travel$travel)
{$this->travel =$travel;
}publicfunctiontraveling(){$this->travel->run();
}
}$travel=newdrive(60,1000);$xiaoming=newhuman($travel);$xiaoming->traveling();
通過(guò)上面的方式松靡,以什么方式旅行,只需要修改配置$config就行莱褒。
這在我們PHP里感觸不明顯,覺(jué)得修改$config和修改$travel = new drive(60,1000)差別不到涎劈,一方面是便于管理广凸,另一方面是PHP的非編譯型的特性優(yōu)勢(shì)阅茶。如果用Java來(lái)實(shí)現(xiàn),感觸就非常明顯了谅海,比如程序已經(jīng)打包了脸哀,只需要修改配置文件,就可以控制類的依賴關(guān)系了扭吁。(千鋒php培訓(xùn))起到了解耦的作用撞蜂。
雖然很多時(shí)候大家一說(shuō)到控制反轉(zhuǎn),依賴注入侥袜,就非要和說(shuō)到反射蝌诡,我覺(jué)得上面IOC只是一種思想,具體的實(shí)現(xiàn)方式枫吧,在不同的語(yǔ)言中有不同的表現(xiàn)形式浦旱。只要將這種依賴關(guān)系解耦出來(lái),可以配置化就是IOC的實(shí)現(xiàn)了九杂。
互聯(lián)網(wǎng)+時(shí)代颁湖,時(shí)刻要保持學(xué)習(xí),攜手千鋒PHP,Dream
It Possible例隆。