說這個話題之前先講一個比較高端的思想--'依賴倒置原則'
"依賴倒置是一種軟件設(shè)計思想贪嫂,在傳統(tǒng)軟件中,上層代碼依賴于下層代碼艾蓝,當下層代碼有所改動時力崇,上層代碼也要相應(yīng)進行改動,因此維護成本較高赢织。而依賴倒置原則的思想是亮靴,上層不應(yīng)該依賴下層,應(yīng)依賴接口于置。意為上層代碼定義接口茧吊,下層代碼實現(xiàn)該接口,從而使得下層依賴于上層接口八毯,降低耦合度搓侄,提高系統(tǒng)彈性"
上面的解釋有點虛,下面我們以實際代碼來解釋這個理論
比如有這么條需求话速,用戶注冊完成后要發(fā)送一封郵件讶踪,然后你有如下代碼:
先有郵件類'Email.class.php'
classMail{
? ? publicfunction send()
? ? {
? ? ? ? /*這里是如何發(fā)送郵件的代碼*/? ? }
}
然后又注冊的類'Register.class.php'
class Register{
? ? private$_emailObj;
? ? publicfunction doRegister()
? ? {
? ? ? ? /*這里是如何注冊*/$this->_emailObj =newMail();
? ? ? ? $this->_emailObj->send();//發(fā)送郵件? ? }
}
然后開始注冊
include'Mail.class.php';
include'Register.class.php';
$reg=new Register();
$reg->doRegister();
看起來事情很簡單,你很快把這個功能上線了泊交,看起來相安無事... xxx天過后乳讥,產(chǎn)品人員說發(fā)送郵件的不好,要使用發(fā)送短信的廓俭,然后你說這簡單我把'Mail'類改下...
又過了幾天云石,產(chǎn)品人員說發(fā)送短信費用太高,還是改用郵件的好... ?此時心中一萬個草泥馬奔騰而過...
這種事情白指,常常在產(chǎn)品狗身上發(fā)生,無可奈何花落去...
以上場景的問題在于酵紫,你每次不得不對'Mail'類進行修改告嘲,代碼復用性很低,高層過度依賴于底層奖地。接下來橄唬,我們就考慮'依賴倒置原則',讓底層繼承高層制定的接口参歹,高層依賴于接口仰楚。
<?php
interface Mail
{
? ? public function send();
}
class Email implements Mail{
? ? public function send()
? ? {
? ? ? ? //發(fā)送Email
????????echo 'i can sent mail<br>';
? ? }
}
class SmsMail implements Mail
{
? ? public function send()
? ? {
? ? ? ? //發(fā)送短信
????????echo 'i can send info<br>';
? ? }
}
class Register
{
? ? public $obj;
? ? public function __construct($mailObj)
? ? {
? ? ? ? $this->obj =? $mailObj;
? ? }
? ? public function doRegister()
? ? {
? ? ? ? $this->obj->send();//發(fā)送信息
? ? }
}
/* 此處省略若干行 */
$emailObj = new Email();
$smsObj = new SmsMail();
$reg = new Register($emailObj);
$reg->doRegister();//使用email發(fā)送
$reg1 = new Register($smsObj);
$reg1->doRegister();//使用短信發(fā)送
/* 你甚至可以發(fā)完郵件再發(fā)短信 */
?>