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

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

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

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

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

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

Зависимость - это когда экземпляр ClassA требует экземпляр ClassB для создания нового экземпляра ClassA.Внедрение зависимости - это когда ClassA передается экземпляр ClassB, либо через параметр в ClassA 's конструктор или через функцию набора ~ DependencyNameHere ~ (~ DependencyNameHere ~ $ param).(Это одна из областей, которые яя не совсем уверен в этом).Контейнер IoC - это одноэлементный класс (в каждый момент времени может быть создан только один экземпляр), где можно зарегистрировать конкретный способ создания экземпляров объектов этого класса для этого проекта.Вот'Ссылка на пример того, что яя пытаюсь описать вместе с определением класса для контейнера IoC I 'мы использовали

Поэтому в этот момент я начинаю пытаться использовать контейнер 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)

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