Мое понимание:
- Зависимость - это когда экземпляр ClassA требует экземпляр ClassB для создания нового экземпляра ClassA.
- Внедрение зависимости - это когда ClassA передается экземпляр ClassB, либо через параметр в конструкторе ClassA, либо через функцию set ~ DependencyNameHere ~ (~ DependencyNameHere ~ $ param). (Это одна из областей, в которой я не совсем уверен).
- Контейнер IoC - это одноэлементный класс (в каждый момент времени может быть создан только один экземпляр), где можно зарегистрировать конкретный способ создания экземпляров объектов этого класса для этого проекта. Здесь ссылка на пример того, что я пытаюсь описать вместе с определением класса для контейнера IoC, который я использую
Поэтому в этот момент я начинаю пытаться использовать контейнер IoC для более сложных сценариев. На данный момент кажется, что для использования контейнера IoC я ограничен отношением has-практически для любого класса, который я хочу создать и который имеет зависимости, которые он хочет определить в контейнере IoC. Что делать, если я хочу создать класс, который наследует класс, но только если родительский класс был создан определенным образом, он был зарегистрирован в контейнере IoC.
Например, я хочу создать дочерний класс mysqli, но хочу зарегистрировать этот класс в контейнере IoC, чтобы создавать экземпляры только с родительским классом, созданным так, как я ранее зарегистрировал в контейнере IoC. Я не могу придумать способ сделать это без дублирования кода (и, поскольку это учебный проект, я стараюсь сделать его как можно более "чистым"). Вот еще несколько примеров того, что я пытаюсь описать.
Итак, вот некоторые из моих вопросов:
- Возможно ли то, что я пытаюсь сделать выше, не нарушая принцип ООП? Я знаю, что в c++ я мог бы использовать динамическую память и конструктор копирования для этого, но я не смог найти такую функциональность в php. (Я признаю, что у меня очень мало опыта использования любых других магических методов, кроме __construct, но из чтения и __clone, если я правильно понял, я не смог использовать его в конструкторе для создания экземпляра дочернего класса как клона экземпляр родительского класса).
- Куда должны идти все мои определения классов зависимостей по отношению к IoC? (Должен ли мой IoC.php просто иметь набор require_once ('dependencyClassDefinition.php') вверху? Моя внутренняя реакция такова, что есть лучший способ, но я еще не нашел его)
- В каком файле я должен регистрировать мои объекты? В настоящее время выполняются все вызовы IoC :: register() в файле IoC.php после определения класса.
- Нужно ли регистрировать зависимость в IoC, прежде чем я зарегистрирую класс, который нуждается в этой зависимости? Поскольку я не вызываю анонимную функцию до тех пор, пока не создам экземпляр объекта, зарегистрированного в IoC, я полагаю, что нет, но это все еще вызывает беспокойство.
- Есть ли что-то еще, что я упускаю из виду, что я должен делать или использовать? Я пытаюсь делать это по одному шагу за раз, но я также не хочу знать, что мой код будет многократно использоваться и, самое главное, что кто-то, кто ничего не знает о моем проекте, сможет прочитать его и понять.