看到網(wǎng)絡(luò)上很多“依賴注入”解釋的話題,這篇博客呢也只是我自己的觀點,如果你有不同的觀點請拍磚,不用客氣。
業(yè)務(wù)場景
小明要去旅游,但是還未確定以什么方式出游,有可能是徒步旅行,也有可能是自駕游。
代碼演示
根據(jù)步行和駕車的速度來考慮距離旅游目的地的路程,所以這里定義了兩個屬性$speed和$distance。所有有了如下代碼:
interfacetravelInterface{publicfunction__construct($speed,$distance);publicfunctionrun();
}abstractclasstravelimplementstravelInterface{protected$speed;//最高時速protected$distance;//最遠路程publicfunction__construct($speed,$distance)
{$this->speed =$speed;$this->distance =$distance;
}
}classdriveextendstravel{publicfunctionrun()
{echo"自駕游";
}
}classwalkextendstravel{publicfunctionrun()
{echo"徒步旅行";
}
}
那么,如果需要換一種出行方式的時候,則需要修改human類。這里看起來修改非常簡單,但是我們實際項目中可能會夾雜著很多的業(yè)務(wù)邏輯一起修改。
就說下依賴注入的基礎(chǔ)方式
classhuman
{protected$travel;//出行方式publicfunction__construct()
{$this->travel =newdrive(60,1000);
}publicfunctiontraveling(){$this->travel->run();
}
}$xiaoming=newhuman();$xiaoming->traveling();
什么是依賴注入。
簡單的說:在A類中使用了B類的實例時,B對象的構(gòu)造不是在A類某個方法中初始化的,而是在A類外部初始化之后以B類的對象傳入進來。這個過程就是依賴注入。
換一種通過配置文件來實現(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();
通過上面的方式,以什么方式旅行,只需要修改配置$config就行。
這在我們PHP里感觸不明顯,覺得修改$config和修改$travel = new drive(60,1000)差別不到,一方面是便于管理,另一方面是PHP的非編譯型的特性優(yōu)勢。如果用Java來實現(xiàn),感觸就非常明顯了,比如程序已經(jīng)打包了,只需要修改配置文件,就可以控制類的依賴關(guān)系了。(千鋒PHP培訓(xùn))起到了解耦的作用。
雖然很多時候大家一說到控制反轉(zhuǎn),依賴注入,就非要和說到反射,我覺得上面IOC只是一種思想,具體的實現(xiàn)方式,在不同的語言中有不同的表現(xiàn)形式。只要將這種依賴關(guān)系解耦出來,可以配置化就是IOC的實現(xiàn)了。