L’injection de dépendance consiste à fournir à une classe les objets dont elle a besoin (ses dépendances) de l’extérieur, plutôt que de les créer elle-même avec new.
Mauvaise approche (fort couplage) :
class NotificationService {
public function notifier(string $email): void {
$mailer = new GmailMailer(); // ← dépendance codée en dur
$mailer->envoyer($email, "Bonjour", "Contenu");
}
}
→ Impossible de changer de mailer sans modifier le code.
→ Impossible de tester sans appeler Gmail.
Bonne approche (injection) :
class NotificationService {
private MailerInterface $mailer;
// On "injecte" le mailer via le constructeur
public function __construct(MailerInterface $mailer) {
$this->mailer = $mailer;
}
public function notifier(string $email): void {
$this->mailer->envoyer($email, "Bonjour", "Contenu");
}
}
→ La classe ne sait pas quel mailer est utilisé.
→ Vous décidez à l’extérieur quelle implémentation fournir.
L’injection découple le code, facilite les tests et les évolutions.