Зависимость PHP Setter с "зависимостями по умолчанию"

В настоящее время я работаю над контейнером для инъекций зависимостей, и я столкнулся с множеством их типов (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');

Я чувствую, что это удобно, так как при тестировании вы можете заменить зависимости на фиктивные классы, и что пользовательский код не должен ничего знать о зависимостях классов. Самым большим недостатком, который я обнаружил, является то, что он по-прежнему создает связь с зависимостями по умолчанию, но это можно легко исправить, проверив, существует класс или нет, и, если он не существует, то не вводить что-либо по умолчанию. Итак, есть ли недостатки этой системы, я должен использовать ее или я должен использовать что-то еще?

Заранее спасибо.

1 ответ

Вы могли бы объединить две вещи:

public function __construct($dep = null)
{
    if (is_null($dep)) {
      $this->_dependency = new Dependency;
    } else {
      $this->_dependency = $dep;
    }
}
Другие вопросы по тегам