最近在使用ThinkPHP5框架,看了下他的原始碼,發現有很多地方也用到了依賴注入(控制反轉),覺得有必要和大家簡單聊一聊什麼是依賴注入以及怎麼使用它。
先看一個例子:
<?php class A { public $b; public $c; public function A() { //TODO } public function Method() { $this->b=new B(); $this->c=new C(); $this->b->Method(); $this->c->Method(); //TODO } } class B { public function B() { //TODO } public function Method() { //TODO echo 'b'; } } class C { public function C() { //TODO } public function Method() { //TODO echo 'c'; } } $a=new A(); $a->Method(); ?>
#上面程式碼,我們很容易理解一句話:
A類別依賴B類別與C類別
也就是說,如果今後開發過程中,要對B類別或C類別修改,一旦涉及函數改名,函數參數數量變動,甚至整個類別結構的調整,我們也要對A類做出相應的調整,A類的獨立性喪失了,這在開發過程中是很不方便的,也就是我們說的“牽一發動全身”,如果兩個類是兩個人分別寫的,矛盾往往就在這個時候產生了。 。 。
萬一真的要改動B類和C類,有沒有辦法,可以不去改動或盡量少改動A類的程式碼呢?這裡要用到控制反轉。
高層模組不應該依賴底層模組,兩個都應該依賴抽象。
控制反轉(IOC)是一種思想,依賴注入(DI)是實施這種思想的方法。
第一種方法叫做:建構器注入(這種方法也不建議用,但比不用好)
#class A { public $b; public $c; public function A($b,$c) { $this->b=$b; $this->c=$c; } public function Method() { $this->b->Method(); $this->c->Method(); } }
$a=new A(new B(),new C()); $a->Method();
class B { public function B() { //TODO } public function Method() { //TODO echo 'b'; } } class B1 extends B { public function B1() { //TODO } public function Method() { echo 'b1'; } } class B2 extends B { public function B2() { //TODO } public function Method() { echo 'b2'; } }
$a=new A(new B2(),new C()); $a->Method();
class Factory { public function Factory() { //TODO } public function create($s) { switch($s) { case 'B': { return new B(); break; } case 'C': { return new C(); break; } default: { return null; break; } } } }
class A { public $b; public $c; public function A() { //TODO } public function Method() { $f=new Factory(); $this->b=$f->create('B'); $this->c=$f->create('C'); $this->b->Method(); $this->c->Method(); //TODO } }
interface IMethod { public function Method(); }
class B implements IMethod { public function B() { //TODO } public function Method() { //TODO echo 'b'; } } class C implements IMethod { public function C() { //TODO } public function Method() { //TODO echo 'c'; } }
#
以上是php中Ioc和Di實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!