Noções básicas sobre contêineres IoC e injeção de dependência

Avanço Rápido:

Estou escrevendo isso com a intenção de entender melhor a injeção de dependência e os contêineres IoC, mas também para que depois eu possa corrigir os erros e usá-los para ajudar a ensinar alguns amigos meus também sobre eles.

A partir de agora eu tentei ler a documentação para vários frameworks (laravel, combustível, codeigniter, symfony) e descobri que havia muitos aspectos diferentes dos frameworks que eu precisava para me sentir confortável usando isso que eu decidi tentar apenas aprenda cada uma das principais peças individualmente, antes de tentar usá-las nos próprios frameworks.

Passei horas pesquisando vários significados, examinando as respostas do stackoverflow e lendo vários artigos tentando entender o que um IoC e como usá-lo para gerenciar corretamente as dependências, e acredito que entendi o que é em conceito, mas ainda sou cinza sobre como implementá-lo corretamente.Acho que a melhor maneira de alguém ler isso para me ajudar é dar o que meu conhecimento atual sobre recipientes de IoC e injeção de dependência é, e então permitir que pessoas que tenham um melhor entendimento do que eu apontem onde minha compreensão é insuficiente.

Meu entendimento:

Uma dependência é quando uma instância de ClassA requer uma instância de ClassB para instanciar uma nova instância de ClassA.Uma injeção de dependência é quando ClassA recebe uma instância de ClassB, por meio de um parâmetro no construtor de ClassA ou por meio de uma função set ~ DependencyNameHere ~ (~ DependencyNameHere ~ $ param).(Esta é uma das áreas nas quais não estou completamente certo).Um contêiner IoC é uma classe singleton (pode ter apenas 1 instância instanciada a qualquer momento) em que a maneira específica de instanciar objetos dessas classes para este projeto pode ser registrada.Aqui está um link para um exemplo do que estou tentando descrever junto com a definição de classe para o contêiner IoC que estou usando

Então, neste ponto, é onde eu começo a tentar usar o contêiner IoC para cenários mais complicados. A partir de agora parece que, para usar o contêiner IoC, estou limitado a um relacionamento has-a para praticamente qualquer classe que eu queira criar que tenha dependências que ele queira definir no contêiner IoC. E se eu quiser criar uma classe que herda uma classe, mas somente se a classe pai tiver sido criada de uma maneira específica, ela foi registrada no contêiner IoC.

Por exemplo: Eu quero criar uma classe filha de mysqli, mas quero registrar essa classe no contêiner IoC para instanciar apenas com a classe pai construída de uma maneira que eu registrei anteriormente no contêiner IoC. Não consigo pensar em uma maneira de fazer isso sem duplicar o código (e, como esse é um projeto de aprendizado, estou tentando mantê-lo o mais "puro" possível).Aqui estão mais alguns exemplos do que estou tentando descrever.

Então, aqui estão algumas das minhas perguntas:

É o que estou tentando fazer acima sem quebrar algum princípio da POO? Eu sei em c + + eu poderia usar a memória dinâmica e um construtor de cópia para realizá-lo, mas eu não fui capaz de encontrar esse tipo de funcionalidade em php. (Admito que tenho muito pouca experiência usando qualquer um dos outros métodos mágicos além da __construct, mas da leitura e do __clone se eu entendi corretamente, eu não pude usar no construtor para fazer a classe filha ser instanciada como um clone de um instância da classe pai).Onde todas as minhas definições de classe de dependência devem estar relacionadas à IoC? (Deve o meu IoC.php apenas ter um monte de require_once ('dependencyClassDefinition.php') no topo? Minha reação instintiva é que há uma maneira melhor, mas eu não tenho uma ainda)Em qual arquivo devo registrar meus objetos? Atualmente fazendo todas as chamadas para IoC :: register () no arquivo IoC.php após a definição da classe.Preciso registrar uma dependência no IoC antes de registrar uma classe que precisa dessa dependência? Desde que eu não estou invocando a função anônima até que eu realmente instancie um objeto registrado no IoC, eu estou supondo que não, mas ainda é uma preocupação.Há mais alguma coisa que eu esteja negligenciando que eu deveria estar fazendo ou usando? Eu estou tentando dar um passo de cada vez, mas eu também não quero saber que meu código será reutilizável e, mais importante, que alguém que não sabe nada sobre o meu projeto pode lê-lo e entendê-lo.

Eu sei que isso é extremamente longo, e só queria agradecer antecipadamente a qualquer um que tenha tido tempo para lê-lo, e ainda mais para alguém compartilhar seus conhecimentos.

questionAnswers(1)

yourAnswerToTheQuestion