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