В настоящее время я работаю над контейнером для инъекций зависимостей, и я столкнулся с множеством их типов (Pimple, Orno / di, Laravel’s …) и планирую сделать что-то похожее на Pimple. Но у меня все еще есть вопрос, если я делаю свой DI, используя сеттеры и геттеры, правильно ли вставлять «зависимости по умолчанию» в конструкторы зависимых классов? Позвольте мне привести пример:
Вот мой пример кода:
<?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');
Я чувствую, что это удобно, так как при тестировании вы можете заменить зависимости на фиктивные классы, и пользовательский код не должен ничего знать о зависимостях классов. Самым большим недостатком, который я обнаружил, является то, что он по-прежнему создает связь с зависимостями по умолчанию, но это можно легко исправить, проверив, существует ли класс или нет, и если он не существует, то по умолчанию ничего не вводить. Итак, есть ли недостатки этой системы, я должен использовать ее или я должен использовать что-то еще?
Заранее спасибо.
Вы могли бы объединить две вещи:
public function __construct($dep = null)
{
if (is_null($dep)) {
$this->_dependency = new Dependency;
} else {
$this->_dependency = $dep;
}
}
Других решений пока нет …