L'injection de dépendance (DI pour les intimes) est un design pattern qui permet de solutionner la problématique de communication entre les classes. Pour comprendre l'interêt de ce design pattern il est important de comprendre la problématique, aussi prenons l'exemple d'une classe se connectant à la base de donnée :
Mais que se passe-t-il si je souhaite me connecter à une autre base de donnée ? Je me retrouve fatalement bloqué car je dois aller modifier toutes mes classes. La première idée serait alors de passer en paramètre au constructeur le nom de la base à utiliser.
Même si cette solution offre plus de flexibilité, on se retrouve quand même avec un problème de logique (pourquoi la classe article devrait avoir à se soucier du nom de la base de donnée ?) et d'évolution (et si je veux utiliser une autre classe que MySQLDatabase ?).
La solution à tous nos problème est de passer directement au constructeur l'objet que l'on souhaite utiliser.
Les 2 classes sont donc bien indépendante et c'est au niveau de notre application que l'on va "injecter" nos objets les uns dans les autres. Cette approche permet de rendre notre code beaucoup plus flexible. Vous vous dites peut être que mon code est du coup beaucoup plus complexe à écrire. Pour nous simplifier la tache on peut alors reprendre le principe des factory pour se créer une sorte de conteneur qui va se charger de gérer la dépendance à notre place.
Cette simple classe nous permet de contrebalancer la lourdeur d'écriture et rend du coup la classe Article aussi simple à utiliser qu'avant.