Comprensión de los contenedores IoC y la inyección de dependencia

Avance rápido:

Estoy escribiendo esto con la intención de comprender mejor la inyección de dependencia y los contenedores IoC, pero también para que luego pueda corregir los errores y usarlo para ayudar a enseñar a algunos amigos míos sobre ellos también.

A partir de ahora, he intentado leer la documentación de varios marcos (laravel, fuel, codeigniter, symfony) y descubrí que había demasiados aspectos diferentes de los marcos que necesitaba para sentirme cómodo al usarlos y decidí intentarlo. Solo aprenda cada una de las piezas principales individualmente antes de intentar usarlas en los marcos.

He pasado horas buscando en Google varios significados, revisando las respuestas de stackoverflow y leyendo varios artículos tratando de entender qué es un IoC y cómo usarlo para administrar las dependencias correctamente, y creo que entiendo lo que es en concepto, pero todavía estoy en gris. sobre cómo implementarlo correctamente.Creo que la mejor manera de que alguien que lea esto me ayude es explicarme cuál es mi comprensión actual de los contenedores de IoC y la inyección de dependencia, y luego permitir que las personas que tienen una mejor comprensión que yo mismo me indiquen dónde se queda corto.

Mi punto de vista:

Una dependencia es cuando una instancia de ClassA requiere una instancia de ClassB para crear una instancia de ClassA.Una inyección de dependencia es cuando a ClassA se le pasa una instancia de ClassB, ya sea a través de un parámetro en el constructor de ClassA o a través de la función de conjunto ~ DependencyNameHere ~ (~ DependencyNameHere ~ $ param).(Esta es una de las áreas en las que no estoy completamente seguro).Un contenedor IoC es una clase singleton (solo se puede crear una instancia de instancia en un momento dado) donde se puede registrar la forma específica de instanciar los objetos de esa clase para este proyecto.Aquí hay un enlace a un ejemplo de lo que estoy tratando de describir junto con la definición de clase para el contenedor IoC que he estado usando

Entonces, en este punto es donde empiezo a usar el contenedor IoC para escenarios más complicados. A partir de ahora, parece que para usar el contenedor IoC, estoy limitado a una relación has-a para casi cualquier clase que quiera crear y que tenga las dependencias que quiere definir en el contenedor IoC. ¿Qué sucede si deseo crear una clase que hereda una clase, pero solo si la clase primaria se creó de una manera específica, se registró en el contenedor IoC?

Así, por ejemplo: quiero crear una clase secundaria de mysqli, pero quiero registrar esta clase en el contenedor IoC para crear una instancia con la clase padre construida de una manera que he registrado previamente en el contenedor IoC. No puedo pensar en una manera de hacer esto sin duplicar el código (y dado que este es un proyecto de aprendizaje, estoy tratando de mantenerlo lo más 'puro' posible).Aquí hay algunos ejemplos más de lo que estoy tratando de describir.

Así que aquí están algunas de mis preguntas:

¿Lo que estoy tratando de hacer arriba es posible sin romper algún principio de OOP? Sé que en c ++ podría usar memoria dinámica y un constructor de copia para lograrlo, pero no he podido encontrar ese tipo de funcionalidad en PHP. (Debo admitir que tengo muy poca experiencia en el uso de cualquiera de los otros métodos mágicos además de __construct, pero si leo y __clone, si lo entendí correctamente, no pude utilizarlo en el constructor para hacer que la clase de niños sea instanciada como un clon de un instancia de la clase padre).¿Dónde deberían ir todas mis definiciones de clase de dependencia en relación con la IoC? (¿Debería mi IoC.php tener un montón de require_once ('dependencyClassDefinition.php') en la parte superior? Mi reacción es que hay una mejor manera, pero aún no he encontrado una)¿En qué archivo debería estar registrando mis objetos? Actualmente hago todas las llamadas a IoC :: register () en el archivo IoC.php después de la definición de la clase.¿Debo registrar una dependencia en la IoC antes de registrar una clase que necesita esa dependencia? Ya que no invoco la función anónima hasta que realmente he creado una instancia de un objeto registrado en la IoC, supongo que no, pero sigue siendo una preocupación.¿Hay algo más que esté pasando por alto y que debería estar haciendo o usando? Intento dar un paso a la vez, pero tampoco quiero saber que mi código será reutilizable y, lo más importante, que alguien que no sepa nada sobre mi proyecto pueda leerlo y entenderlo.

Sé que esto es extremadamente largo, y solo quería dar las gracias de antemano a cualquiera que se haya tomado el tiempo de leerlo, y aún más a cualquiera que comparta sus conocimientos.

Respuestas a la pregunta(1)

Su respuesta a la pregunta