我最近了解到在我的 PHP 应用程序中使用依赖注入 (DI) 的优势。但是,我仍然不确定如何为依赖项创建容器,或者我是否应该在我正在构建的在线论坛中使用 DI。
以下代码是我根据从这里学到的示例制作的 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) 我应该在哪里实例化我注入的依赖项,例如 $database、$session 等?它是在容器类之外,还是在容器的构造函数内。
2)如果我需要在其他类中创建用户类的多个实例怎么办?我无法注入先前实例化的 $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? 检查这个链接。