Moin!
Dependency Injection muss nicht nur über den Konstruktor erfolgen, man kann die notwendigen Dinge auch bei Methodenaufrufen übergeben. Dann muss man sie erst erzeugen, wenn die Methode tatsächlich verwendet wird.
Das war mir so bisher auch noch nicht bewusst. Danke dafür!
In der Tat gibt es eigentlich nur genau ZWEI Methoden, in PHP Dependency Injection zu realisieren:
1. Übergabe der externen Abhängigkeit als Konstruktorparameter (Konstruktor-Injection).
2. Übergabe der externen Abhängigkeit über eine Setter-Methode (Setter-Injection).
Als Variante von 2. gibt es auch noch
2a. Übergabe der externen Abhängigkeit über eine Setter-Methode, die deshalb existiert, weil die Klasse ein Interface implementiert, welches für DI genutzt wird (Interface-Injection).
Variante 2a ist vor allem für Frameworks interessant, die die zusammenzuhängenden Klassen untersuchen und die Abhängigkeiten automatisch auflösen können. Es verringert den Aufwand bei der Konfiguration der Klassenzusammensetzung und macht die Abhängigkeiten expliziter, indem es sie in den ausgeführten Code verlagert. Für die manuelle Anwendung ist Interface-Injection allerdings eher nicht notwendig.
Noch ein wichtiger Punkt: Dependency Injection ist ein Programmierprinzip. Es anzuwenden bedeutet, dass man seine Klassen so schreibt, dass man in diese die innen benutzten Klassen von außen hineintun kann - egal wie das passiert.
Davon zu unterscheiden sind Dependency Injection Container oder -Frameworks. Diese vereinfachen bzw. automatisieren lediglich das Zusammenbauen eines funktionsfähigen Klassenbaums. DI-Container benötigen zwingend Dependency Injection als Programmierprinzip, aber Dependency Injection benötigt KEINE DI-Container-Frameworks.
- Sven Rautenberg