Inyeccion de Dependencias es uno de esos patrones de diseño que tienen un nombre “elegante” y “rimbombante”.

Sin embargo, es un patrón extremadamente sencillo y muchísimos programadores lo utilizan sin darse cuenta que lo están usando. También muchos "expertos" lo complican mucho más de lo necesario.

Existen dos tipos de inyección, el primer tipo es a través del constructor de la clase y la segundo a través de setters. Éste tutorial cubre exclusivamente la inyección de dependencias con constructores.

En palabras simples la inyección de dependencias te permite pasar a través del constructor de la clase todos los objetos que necesita tu clase para funcionar. En palabras aún más simples: Una dependencia es un instancia de la clase B, que la clase A necesita para poder hacer su trabajo.

Por ejemplo, un carro depende de un motor para hacer su trabajo. Un código sin inyección de dependencias lucirīa así:

El problema con la implementación anterior, es que la clase “Motor” se declara implícitamente o dicho de otra forma: No es posible saber que existe dicho objeto hasta inspeccionar código fuente de la clase Carro. Por lo tanto no solamente la declaración es implícita sino que las clases también están acopladas.

Es decir, que no puedes sustituir la clase Motor, por MotorDiesel o MotorBiodiesel sin modificar el código de la clase Carro. De ésta misma manera, la clase se vuelve difícil de mantener y difícil de depurar. Es aquí donde entra en juego la inyección de dependencia, ya que cuando utilizas éste patrón estás haciendo explicita la declaración de la clase y por lo tanto desacoplando Carro de Motor. El código anterior, cambia a:

Y listo! Eso es inyección de dependencias! Nada difícil ¿verdad?

Cuando usas inyección de dependencias, si quieres cambiar el “Motor” del “Carro”, lo único que tienes que hacer es crear una clase que extienda la clase Motor y pasarla como dependencia de la clase carro y listo!

Si encuentras un error en la implementación anterior, o no estás seguro de como utilizar inyección de dependencias en PHP déjame un comentario y te contesto!

Referencias:
http://fabien.potencier.org/article/11/what-is-dependency-injection
http://www.jamesshore.com/Blog/Dependency-Injection-Demystified.html
http://martinfowler.com/articles/injection.html
http://misko.hevery.com/2009/02/19/constructor-injection-vs-setter-injection/