PHP-DI für PHP: Komplettguide mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einführung in PHP-DI: Was ist das und warum braucht man es?

PHP-DI (PHP Dependency Injection) ist eine leistungsstarke Bibliothek für die Abhängigkeitsinjektion (Dependency Injection, DI) in PHP-Anwendungen. Sie implementiert das Inversion-of-Control-Prinzip (IoC) und stellt einen Container bereit, der Abhängigkeiten zwischen Klassen automatisch auflöst.

Warum braucht man PHP-DI? In modernen PHP-Projekten (besonders mit Frameworks wie Laravel, Symfony, Slim) sind Klassen oft von anderen Klassen abhängig. Ohne einen DI-Container müssen Sie alle Abhängigkeiten manuell erstellen – das führt zu:

  • Starker Kopplung des Codes (tight coupling)
  • Schwierigkeiten beim Testen
  • Code-Wiederholungen beim Erstellen von Objekten
  • Problemen bei Wartung und Erweiterung

PHP-DI löst diese Probleme, indem es automatisch erkennt, welche Klassen Ihr Code benötigt, und diese mit den richtigen Abhängigkeiten erstellt. Die Bibliothek unterstützt:

  • Automatische Injektion über den Konstruktor
  • Definition von Abhängigkeiten über Annotationen (phpDoc)
  • Konfiguration über Arrays, YAML oder PHP-Dateien
  • Lazy Loading
  • Integration mit gängigen Frameworks

Installation von PHP-DI

PHP-DI wird über Composer installiert – den Standard-Paketmanager für PHP:

composer require php-di/php-di

Wenn Sie das Slim-Framework verwenden, installieren Sie das Integrationspaket:

composer require php-di/slim-bridge

Für Symfony gibt es ein separates Paket:

composer require php-di/symfony-bridge

Nach der Installation binden Sie den Composer-Autoloader in Ihr Projekt ein:

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

Schnellstart mit einem Codebeispiel

Betrachten wir ein einfaches Beispiel zur Nutzung von PHP-DI. Angenommen, wir haben eine Klasse Mailer, die von der Klasse Logger abhängt:

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

// Mailer-Klasse, die von Logger abhängt
class Mailer {
    private $logger;
    
    public function __construct(Logger $logger) {
        $this->logger = $logger;
    }
    
    public function send($to, $subject) {
        $this->logger->log("Sende E-Mail an {$to}: {$subject}");
        // Versandlogik...
    }
}

// DI-Container erstellen
$container = new DI\Container();

// Mailer-Objekt abrufen – alle Abhängigkeiten werden automatisch aufgelöst
$mailer = $container->get('Mailer');
$mailer->send('user@example.com', 'Hallo!');
?>

In diesem Beispiel erstellt PHP-DI automatisch eine Instanz von Logger und übergibt sie an den Konstruktor von Mailer. Sie müssen nicht new Logger() schreiben – der Container erledigt das für Sie.

Wichtige Methoden und Funktionen von PHP-DI

1. Container::get() – Objekt aus dem Container abrufen

Funktion: Ruft ein Objekt anhand seines Namens (Klasse, Interface oder Alias) aus dem Container ab. Wenn das Objekt noch nicht erstellt wurde, erstellt der Container es samt aller Abhängigkeiten.

Parameter:

  • string $name – Name der Klasse, des Interfaces oder Alias

Beispiel:

$container = new DI\Container();
$logger = $container->get('Logger'); // Erstellt und gibt ein Logger-Objekt zurück
$mailer = $container->get('Mailer'); // Erstellt Mailer mit integriertem Logger

2. Container::set() – Definition registrieren

Funktion: Registriert eine Definition für eine Klasse, ein Interface oder einen Alias. Ermöglicht die Angabe, wie das Objekt genau erstellt werden soll.

Parameter:

  • string $name – Name der Klasse oder Alias
  • mixed $definition – Definition (String, Array, Closure, Definition-Objekt)

Beispiel:

Empfehlungen