php依赖注入解决什么问题,php – 了解依赖注入的问题
我正在建立一個小項目,盡量教自己盡可能多的基礎(chǔ)知識,對我而言,意味著不要使用預(yù)制框架(As Jeff
once put it,“不要重塑輪子,除非你計劃學(xué)習(xí)更多關(guān)于輪子“[重點]),并遵循測試驅(qū)動發(fā)展的原則。
在我的追求中,我最近遇到了Dependency Injection的概念,這對TDD很重要。我的問題是我不能把我的頭圍繞著它。到目前為止,我的理解是,它或多或少相當(dāng)于“讓呼叫者通過類/方法可能需要的任何其他類,而不是讓他們自己創(chuàng)建”。
我有兩個我想用DI解決的示例問題。我在這些重構(gòu)的正確軌道上嗎?
數(shù)據(jù)庫連接
我打算使用單例來處理數(shù)據(jù)庫,因為我目前不希望使用多個數(shù)據(jù)庫。最初,我的模型看起來像這樣:
class Post {
private $id;
private $body;
public static function getPostById($id) {
$db = Database::getDB();
$db->query("SELECT...");
//etc.
return new Post($id, $body);
}
public function edit($newBody) {
$db = Database::getDB();
$db->query("UPDATE...");
//etc.
}
}
用DI,我覺得看起來更像這樣:
class Post {
private $db; // new member
private $id;
private $body;
public static function getPostById($id, $db) { // new parameter
$db->query("SELECT..."); // uses parameter
//etc.
return new Post($db, $id, $body);
}
public function edit($id, $newBody) {
$this->db->query("UPDATE..."); // uses member
//etc.
}
}
我仍然可以使用單例,使用應(yīng)用程序設(shè)置中指定的憑據(jù),但是我只需要從控制器傳遞它(控制器無論如何都是無法測試的):
Post::getPostById(123, Database::getDB);
模型調(diào)用模型
舉個例子,一個有觀點的帖子。由于確定視圖是否為新的邏輯不是Post對象特有的,所以它只是在自己的對象上成為靜態(tài)方法。然后Post對象就會調(diào)用它:
class Post {
//...
public function addView() {
if (PageView::registerView("post", $this->id) {
$db = Database::getDB();
$db->query("UPDATE..");
$this->viewCount++;
}
}
用DI,我覺得看起來更像這樣:
class Post {
private $db;
//...
public function addView($viewRegistry) {
if ($viewRegistry->registerView("post", $this->id, $this->db) {
$this->db->query("UPDATE..");
$this->viewCount++;
}
}
這將調(diào)用從控制器更改為:
$post->addView(new PageView());
這意味著實例化一個只有靜態(tài)方法的類的新實例,這對我來說很不好(我認(rèn)為在某些語言中是不可能的,但是在這里是可行的,因為PHP不允許類本身是靜態(tài)的)。
在這種情況下,我們只能深入一層,所以使控制器實例化一切似乎都可行(盡管PageView類通過Post的成員變量間接獲取了數(shù)據(jù)庫連接),但是如果你覺得不得不調(diào)用一個需要一個需要一個類的類的類的方法。我想這只是意味著這也是一個代碼氣味。
我正在跟蹤這個軌道,還是完全誤解了DI?任何批評和建議都不勝感激。
總結(jié)
以上是生活随笔為你收集整理的php依赖注入解决什么问题,php – 了解依赖注入的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis中resultType取出
- 下一篇: php中队列控制的方法,学习猿地-php