В настоящее время я работаю над контейнером для инъекций зависимостей, и я наткнулся на множество разных типов (Pimple, Orno/di, Laravel's ...), и я планирую сделать что-то недалеко от Пимпла. Но у меня все еще есть вопрос: если я использую DI с помощью сеттеров и геттеров, правильно ли вводить «зависимости по умолчанию» в конструкторах зависимых классов? Позвольте мне дать вам Exemple:Зависимость PHP Setter от «зависимостей по умолчанию»
Так вот мой Exemple код:
<?php
class Dependency
{
public function print($str)
{
echo $str;
}
}
class Dependent
{
private $_dependency;
public function __construct()
{
$this->_dependency = new Dependency;
}
public function setDependency(Dependency $dep)
{
$this->_dependency = $dep;
return $this;
}
public function depPrint($str)
{
$this->_dependency->print($str);
return $this;
}
}
Таким образом, пользовательский код может непосредственно использовать класс, не зная его зависимости:
$instance = new Dependent;
$instance->depPrint('Hello world');
Или, если код пользователя нуждается в классе для использования другой зависимости, он может сделать именно так:
$instance = new Dependent;
$instance->setDependency(new Dependency)
->depPrint('Hello world');
Я чувствую себя e, это удобно, так как при тестировании вы можете заменить зависимости с помощью макетных классов и что код пользователя не должен знать ничего о зависимостях классов. Самый большой недостаток, который я обнаружил, заключается в том, что он по-прежнему создает связь с зависимостями по умолчанию, но это можно легко устранить, проверяя, существует ли класс или нет, а если он не существует, то не вводите ничего по умолчанию. Итак, есть ли недостатки в этой системе, следует ли использовать ее или использовать другое?
Заранее спасибо.
Я видел некоторые люди говорят, что «аргументы конструктору не должен быть факультативным», я не знаю, если это правда, но в любом случае ваш вариант интересен, я буду видеть если я могу применить его к моему истинному коду. Спасибо! – TheKitsuneWithATie