Задать вопрос

IoC в PHP, как ему лучше объяснить, какой объект инициализировать?

Есть некий мини велосипедный Inversion of Control объект. То-есть когда он создается классы вот таким вот образом
IoC->Create('Model_Test');
То автоматом инициализируется все зависимые классы.
IoC->Create('Model_Test'); = new Model_Test(new DB, new Model_Test3);

Правда их инициализирует сам класс(точнее методы реализованы в базовом классе), таким образом это больше Service Locator конечно или даже Class Factory но не в этом суть. Вопрос вот в чем

Исходя из правильности подхода какие классы должны быть инициализированные определяются на основе ранее привязанных к ним интерфейсов. То-есть если в конструкторе идет IBaseDB интерфейс и мы привязали его ранее к классу BaseDB то при инициализации понятно что нужно его пихать.

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

Есть еще вариант сделать еще 1 интерфейс с другим именем и тогда при инициализации класса не нужно будет делать дополнительные связи. Но такой подход кажется неправильный так как придется делать полный дубль первого интерфейса со всеми его методами.
  • Вопрос задан
  • 2608 просмотров
Подписаться 3 Оценить 4 комментария
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
Есть еще вариант сделать еще 1 интерфейс с другим именем и тогда при инициализации класса не нужно будет делать дополнительные связи. Но такой подход кажется неправильный так как придется делать полный дубль первого интерфейса со всеми его методами.

//Допустим есть базовый интерфейс:
interface IBaseDB{
    // здесь список методов
}
//Просто наследуем 2 пустых интерфейса от него:
interface IBaseDBLogDB extends IBaseDB{}
interface IBaseDBMasterDB extends IBaseDB{}
//и Забиваем их в IoC:
$IoC->Bind('IBaseDBLogDB',$log_db_connection_instance);
$IoC->Bind('IBaseDBMasterDB',$master_db_connection_instance);

Не вижу здесь дублирования кода, на мой взгляд вполне жизнеспособное решение.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
IT ATLAS Москва
от 250 000 до 500 000 ₽