1. 程式人生 > 其它 >PHP控制反轉(IOC)

PHP控制反轉(IOC)

控制翻轉:IOC(inversion of control)控制反轉模式;控制反轉是將對3類(元件間)的依賴關係從程式內部提到外部來管理;

概念理解
我們先來介紹控制反轉,依賴注入,這兩個概念我們可以認為他們表達的同一種意思,舉個通俗的例子,我們使用者登入需要提供記錄日誌的功能,可以選擇使用檔案或者資料庫。下面我們用程式碼來演示。

// 定義寫日誌的介面規範
interface log
{
    public function write();   
}

// 檔案記錄日誌
class FileLog implements Log
{
    public function write(){
        echo 'file log write...';
    }   
}

// 資料庫記錄日誌
class DatabaseLog implements Log
{
    public function write(){
        echo 'database log write...';
    }   
}

// 程式操作類
class User 
{
    protected $fileLog;

    public function __construct()
    {
        $this->fileLog = new FileLog();   
    }

    public function login()
    {
        // 登入成功,記錄登入日誌
        echo 'login success...';
        $this->fileLog->write();
    }

}

$user = new User();
$user->login();

  上面的寫法可以實現記錄日誌的功能,但是有一個問題,假設現在想用資料庫記錄日誌的話,我們就得修改User類,這份程式碼沒達到解耦合,也不符合程式設計開放封閉原則,那如何修改呢?我們可以把日誌處理類通過建構函式方式傳遞進去。下面我們試著修改User類的程式碼。

class User 
{
    protected $log;

    public function __construct(Log $log)
    {
        $this->log = $log;   
    }

    public function login()
    {
        // 登入成功,記錄登入日誌
        echo 'login success...';
        $this->log->write();
    }

}

$user = new User(new DatabaseLog());
$user->login();

  這樣想用任何方式記錄操作日誌都不需要去修改過User類了,只需要通過建構函式引數傳遞就可以實現,其實這就是“控制反轉”。不需要自己內容修改,改成由外部外部傳遞。這種由外部負責其依賴需求的行為,我們可以稱其為 “控制反轉(IoC)”。