服務容器(自己總結)依賴注入

baotong發表於2019-09-15

為了理解什麼是服務容器,查了很多資料(給自己看的)。我看的每個資料都會講解什麼是依賴注入還有反轉控制(IoC),剛開始真不好理解!!依賴注入其實就是需要的類實現類(比如例項)傳給你要用到的類裡面去,通常通過建構函式。目的是為了實現程式之間的解耦。可以看下下面的例子。

Visit.php檔案

<?php
// 設計公共介面
interface Visit{
    public function go();
}
// 實現不同交通工具類
class Leg implements Visit{
    public function go()
    {
        echo 'walk to Tibet';
    }
}
class Car implements Visit{
    public function go()
    {
        echo 'drive car to Tibet !!!';
    }
}
class Train implements Visit{
    public function go()
    {
        echo 'go to Tibet by train!!!';
    }
}

通常我們寫業務程式碼的時候我們都會這麼寫。

Traveller.php檔案

<?php
// 引入介面檔案
include './Visit.php';
class Traveller {
    protected $trafficTool;

    public function __construct()
    {
        $this->trafficTool = new Leg();
    }

    public function visitTibet()
    {
        $this->trafficTool->go();
    }
}

$tra = new Traveller();
$tra->visitTibet();

簡單說下上面的程式碼表單什麼意思。我有個介面叫參觀(Visit),裡面定一了一個走的方法(go)。下面有它的實現類。腳(leg),轎車(car),火車(train)。再定義一個旅遊者類,他要去拉薩。
我通常寫程式碼都會想上面Traveller類一樣。其實上面的程式碼有個問題,就是耦合,這兩個程式之間產生了依賴關係。這種情況在簡單的程式裡面體現不出什麼。但如果需求變更。比方說:我不要走著去拉薩我要坐火車去。這個時候上面的程式碼則必須要修改。
依賴注入則不會。用依賴注入方式實現上面的程式碼。

Traveller.php檔案

<?php

class Traveller 
{

    protected $trafficTool;
//    為啥前面的那個Visit 不加上的化就不行?
    public function __construct(Visit $trafficTool)
    {
        $this->trafficTool = $trafficTool;
    }

    public function visitTibet()
    {
        $this->trafficTool->go();
    }

}

說實話剛看到的時候覺得沒有變化。就是把new一個類提到外面。其實變化還是蠻大的。這裡它實現瞭解耦。就算要求改成其他交通工具car、train都不會影響到traveller這個類。都是在外部實new完在傳進來。

相關文章