Понимание IoC-контейнеров и внедрение зависимостей

Быстрая перемотка вперед:

Я пишу это с целью лучшего понимания внедрения зависимостей и контейнеров IoC, но также и для того, чтобы впоследствии я мог исправить ошибки в них и использовать их, чтобы научить некоторых моих друзей о них.

На данный момент я попытался прочитать документацию по различным фреймворкам (laravel, fuel, codeigniter, symfony) и обнаружил, что существует слишком много различных аспектов фреймворков, которые мне нужны, чтобы чувствовать себя комфортно, используя его, и я решил попробовать Просто изучите каждую из основных частей по отдельности, прежде чем пытаться использовать их в самих рамках.

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

Мое понимание:

Зависимость - это когда экземпляр 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, я полагаю, что нет, но это все еще вызывает озабоченность.Есть ли что-то еще, что я упускаю из виду, что я должен делать или использовать? Я пытаюсь делать это по одному шагу за раз, но я также не хочу знать, что мой код будет многократно использоваться и, самое главное, что кто-то, кто ничего не знает о моем проекте, сможет прочитать его и понять.

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

Ответы на вопрос(1)

Ваш ответ на вопрос