考慮乙個問題,如果乙個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 繫結乙個閉包到容器 閉包現在請理解為...