我最近了解到在我的PHP應用程序中使用依賴注入(DI)的優勢。但是,我仍然不確定如何爲依賴關係創建容器,或者我是否應該使用DI來創建我正在構建的在線論壇。如何構建PHP依賴注入容器
以下代碼是我根據我從here獲悉的示例製作的DI容器的版本。
class ioc {
var $db;
var $session;
var $user_id;
static function newUser(static::$db, static::$user_id) {
$user = new User($db, $user_id);
return $user;
}
static function newLogin(static::$db, static::$session) {
$login = new Login($db, $session);
return $login;
}
}
$user = ioc::newUser();
$login = ioc::newLogin();
我有幾個問題:
1)我應該在哪裏我的實例注入相關性,比如$數據庫,$會議等?它會在容器類之外,還是在容器的構造函數之內。
2)如果我需要在其他類中創建User類的多個實例,該怎麼辦?我無法注入先前實例化的$ user對象,因爲該實例已被使用。但是,在另一個類中創建多個User實例會違反DI的規則。例如:
class Users {
function __construct($db, $user_id) {
$this->db = $db;
$this->user_id = $user_id;
}
function create_friends_list() {
$st = $this->$db->prepare("SELECT user_id FROM friends WHERE user_id = $this->user_id");
$st->execute();
while($row = $st->fetch()) {
$friend = ioc::newUser($row['user_id']);
$friend->get_user_name();
$friend->get_profile_picture();
}
}
}
3)我想知道如果我甚至應該採用DI,知道我要重寫所有我以前的代碼。我以前一直依靠全局變量,我在我的initialize.php中實例化了,它包含在我的所有文件中。
在我看來,DI創造了很多開銷,並且有些情況下它是不可用的(如在我的#2例子中)。以下網站來自開發人員,他列舉了許多不使用DI的很好理由。他的論點有什麼優點嗎?或者我只是使用DI錯誤? check this link。
我已經讀了幾次這個網站,主要是關於作者是多麼憤怒的迷戀。顯然他的言論自由延伸到在他們自己的博客上侮辱人,而刪除他的人是納粹。哦,親愛的......':)' – halfer
爲了更直接地回答這個問題(!),Symfony2有一個[獨立的DI組件](http://symfony.com/doc/current/components/dependency_injection/index.html ),你可能會覺得值得一看。 – halfer
查看http://docs.codehaus.org/display/PICO/IoC+Types瞭解各種方法的一些信息。 – Gordon