Dependency Injection – klingt nach professioneller Programmierung. Aber was ist das eigentlich?
Wenn man nach Dependency Injection sucht, gibt es fast ausschließlich komplexe Erklärungen, die man nicht auf Anhieb versteht. Deshalb gibt es an dieser Stelle eine möglichst einfache Erläuterung von Dependency Injection in PHP.
Nehmen wir einmal an wir haben eine Klasse Gästebuch, die beim instanziieren ein Datenbank-Objekt erwartet.
class Guestbook { /** * @var DatabaseDriver */ protected $db; public function __construct(DatabaseDriver $db) { $this->db = $db; } } |
Jetzt ist es aber aufwendig bei jeder Erzeugung eines neuen Gästebuchs das Datenbank-Objekt zu übergeben, vor allem weil die Datenbank bei allen Gästebüchern die gleiche ist. Also wurde das Entwurfsmuster Dependency Injection entwickelt, das dieses Vorgehen vereinfachen soll.
class Guestbook { /** * @var DatabaseDriver * @inject */ protected $db; public function __construct() { $result = $this->db->query("SELECT * FROM guestbook"); ... } } |
Dieses Beispiel funktioniert natürlich nicht ohne Weiteres, es zeigt aber die Idee hinter DI. Durch zum Beispiel die Angabe der Annotation @inject wird angezeigt, dass die Datenbank noch vor der Instanziierung von Guestbook eingefügt werden soll und wir damit quasi sofort arbeiten können.
In PHP gibt es diverse Frameworks, die das DI-Entwurfsmuster bereits implementieren. Dazu gehören unter anderem FLOW3, Zend Framework 2 und Symfony 2, aber eine wirklich saubere Lösung ist meiner Meinung nach noch nicht dabei. Bei FLOW3 beispielsweise werden die eigentlichen Klassen durch Fake-Klassen „überschrieben“, in denen dann das Inject vollzogen wird.
Wer DI also nutzen will, braucht in jedem Fall eine Logik, die das Inject überhaupt ausführt. Ohne Framework keine leichte Aufgabe.