Недавно я узнал о преимуществах использования Dependency Injection (DI) в моем приложении PHP. Тем не менее, я все еще не уверен, как создать контейнер для зависимостей, или я должен использовать 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 неправильно? проверьте эту ссылку.