PHP 依賴注入,注入容器和服務定位器

2021-09-10 07:28:22 字數 2292 閱讀 3306

考慮乙個問題,如果乙個web應用需要乙個日誌服務,日誌服務可以是文字,資料庫或者郵件的形式,

而且日誌需要將獲取的資訊格式化指定的形式。應用可以根據需要,任意切換日誌服務是文字還是數

據庫還是郵件。如果以傳統的方式,日誌記錄的**類似下面的形式:

class

logger

public

function

log(

$str

,$type)}

public

function

databaselog

($str

)public

function

filelog

($str

)public

function

emaillog

($str).

..}

說的太高深了,就是解除**之間的耦合關係。

注入有一下幾種方式

class logger

public function log($str)

}class fileloggerhandler

public function log($str)

}class emailloggerhandler

public function log($str)

}//呼叫

$fileloggerhandler = new fileloggerhandler(web_root.'/logger/login.log');

$logger = new logger(fileloggerhandler);

$logger->log('login error'.geterror());

$emailloggerhandler = new emailloggerhandler(dev_abb_email);

$logger = new logger(emailloggerhandler);

$logger->log('login error'.geterror());

$logger = new logger();

$logger->setloggerhandler(fileloggerhandler);

$logger->log();

$logger->setloggerhandler(emailloggerhandler);

$logger->log();

上面的兩種注入方式都需要提前準備依賴的類物件。加速檔案日誌類依賴檔案讀寫類,依賴

目錄操作,許可權驗證等相關類檔案,則需要按依賴順序構造好相應的類物件,並且對各個對

象進行依賴的注入。所以需要重複很多物件建立,set的操作。因此就有了依賴注入容器

container,用於實現類的依賴物件的管理等操作。github上有乙個最最簡單的container

twittee,簡單而有效。

class container

function __get($k)

}class logger

public function addcontainerdata($key,$class)

public function log($containerkey,$str)

}//使用

$logger = new logger();

$logger->addcontainnerdata('filelog','fileloggerhandler');

$logger->log('error info');

這個最簡單的注入容器解決了依賴物件建立繁雜的問題。但是沒有解決注入物件依賴問題。所以

一些框架的依賴注入容器中新增了獲取物件依賴的操作:

class container

function __get($k)

function getdepends($key)

else}}

$this->_reflections[$class] = $ref;

$this->_dependencies[$class] = $dependencies;}}

//使用

$logger = new logger();

$logger->addcontainnerdata('filelog','fileloggerhandler');//這裡會自動建立fileloggerhandler依賴類物件

$logger->log('error info');

php依賴注入

依然是來自到喜啦的一道面試題,你知道什麼是依賴注入嗎?依賴注入 di 的概念雖然聽起來很深奧,但是如果你用過一些新興的php框架的話,對於di一定不陌生,因為它們多多少少都用到了依賴注入來處理類與類之間的依賴關係。class a 為什麼這種方案不可取呢?因為這樣的話,a與b就耦合在了一起,也就是說a...

依賴注入和容器

下面列子gundong方法和kaochuan方法緊密結合,偶合度高,不利於擴充套件和維護。程式設計需要降低偶合度,增加可擴充套件性。class luntai class baoma baoma new baoma baoma kaochuan 使用依賴注入優化後的寫法 class luntai cl...

thinkphp(trait 依賴注入 容器)

1 trait 優先順序 子類 trait 父類 3 容器與依賴注入原理 class demo1 temp setname hhh return temp getname 繫結乙個類到容器 進去是類,出來是物件 public function bindclass 繫結乙個閉包到容器 閉包現在請理解為...