PHP-DI pour PHP : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction à PHP-DI : qu'est-ce que c'est et pourquoi l'utiliser ?

PHP-DI (PHP Dependency Injection) est une bibliothèque puissante pour l'injection de dépendances (Dependency Injection, DI) dans les applications PHP. Elle implémente le pattern Inversion of Control (IoC) et fournit un conteneur pour résoudre automatiquement les dépendances entre les classes.

Pourquoi utiliser PHP-DI ? Dans les projets PHP modernes (notamment avec des frameworks comme Laravel, Symfony, Slim), les classes dépendent souvent d'autres classes. Sans conteneur DI, vous devez créer manuellement toutes les dépendances, ce qui entraîne :

  • Un couplage fort du code (tight coupling)
  • Des difficultés de test
  • Une duplication de code lors de la création d'objets
  • Des problèmes de maintenance et d'extension

PHP-DI résout ces problèmes en déterminant automatiquement les classes nécessaires à votre code et en les créant avec les bonnes dépendances. La bibliothèque prend en charge :

  • L'injection automatique via le constructeur
  • La définition des dépendances via des annotations (phpDoc)
  • La configuration via des tableaux, YAML ou fichiers PHP
  • Le chargement différé (lazy loading)
  • L'intégration avec les frameworks populaires

Installation de PHP-DI

PHP-DI s'installe via Composer, le gestionnaire de paquets standard pour PHP :

composer require php-di/php-di

Si vous utilisez le framework Slim, installez le paquet d'intégration :

composer require php-di/slim-bridge

Pour Symfony, un paquet dédié est disponible :

composer require php-di/symfony-bridge

Après l'installation, incluez l'autoloader de Composer dans votre projet :

require __DIR__ . '/vendor/autoload.php';

Démarrage rapide avec un exemple de code

Prenons un exemple simple d'utilisation de PHP-DI. Supposons que nous ayons une classe Mailer qui dépend d'une classe Logger :

<?php
// Classe Logger
class Logger {
    public function log($message) {
        echo "[LOG]: " . $message . "\n";
    }
}

// Classe Mailer qui dépend de Logger
class Mailer {
    private $logger;
    
    public function __construct(Logger $logger) {
        $this->logger = $logger;
    }
    
    public function send($to, $subject) {
        $this->logger->log("Envoi d'un email à {$to} : {$subject}");
        // Logique d'envoi...
    }
}

// Création du conteneur DI
$container = new DI\Container();

// Récupération de l'objet Mailer — toutes les dépendances sont résolues automatiquement
$mailer = $container->get('Mailer');
$mailer->send('user@example.com', 'Bonjour !');
?>

Dans cet exemple, PHP-DI crée automatiquement une instance de Logger et la transmet au constructeur de Mailer. Inutile d'écrire new Logger() — le conteneur le fait pour vous.

Méthodes et fonctions principales de PHP-DI

1. Container::get() — récupération d'un objet depuis le conteneur

Fonction : Extrait un objet par son nom (classe, interface ou alias) du conteneur. Si l'objet n'est pas encore créé, le conteneur le crée ainsi que toutes ses dépendances.

Paramètres :

  • string $name — nom de la classe, de l'interface ou alias

Exemple :

$container = new DI\Container();
$logger = $container->get('Logger'); // Crée et retourne un objet Logger
$mailer = $container->get('Mailer'); // Crée Mailer avec Logger à l'intérieur

2. Container::set() — enregistrement d'une définition

Fonction : Enregistre une définition pour une classe, une interface ou un alias. Permet de spécifier comment l'objet doit être créé.

Paramètres :

  • string $name — nom de la classe ou alias
  • mixed $definition — définition (chaîne, tableau, closure, objet Definition)

Exemple :

Recommendations