Grundlegendes zu IoC-Containern und Abhängigkeitsinjektion

Schneller Vorlauf:

Ich schreibe dies mit der Absicht, ein besseres Verständnis der Abhängigkeitsinjektion und der IoC-Container zu erlangen, aber auch, um anschließend die Fehler darin zu korrigieren und einige meiner Freunde darüber zu unterrichten.

Ab sofort habe ich versucht, die Dokumentation für verschiedene Frameworks (Laravel, Fuel, Codeigniter, Symfony) durchzulesen. Dabei stellte ich fest, dass es zu viele verschiedene Aspekte der Frameworks gab, mit denen ich mich wohlfühlen wollte, als dass ich es versucht hätte Lernen Sie einfach jedes der Hauptstücke einzeln, bevor Sie versuchen, sie in den Frameworks selbst zu verwenden.

Ich habe stundenlang verschiedene Bedeutungen gegoogelt, Stapelüberlaufantworten durchgesehen und verschiedene Artikel gelesen, um zu verstehen, was eine IoC ist und wie man sie verwendet, um Abhängigkeiten richtig zu verwalten, und ich glaube, ich verstehe, was es im Konzept ist, aber ich bin immer noch grau wie man es richtig umsetzt.Ich denke, der beste Weg für jemanden, der dies liest, um mir zu helfen, besteht darin, mein derzeitiges Verständnis von IoC-Containern und der Abhängigkeitsinjektion zu vermitteln und dann Leute, die ein besseres Verständnis als ich haben, darauf hinzuweisen, wo mein Verständnis mangelhaft ist.

Mein Verständnis:

Eine Abhängigkeit liegt vor, wenn eine Instanz von ClassA eine Instanz von ClassB benötigt, um eine neue Instanz von ClassA zu instanziieren.Eine Abhängigkeitsinjektion liegt vor, wenn ClassA eine Instanz von ClassB entweder über einen Parameter im Konstruktor von ClassA oder über eine Funktion set ~ DependencyNameHere ~ (~ DependencyNameHere ~ $ param) übergeben wird.(Dies ist einer der Bereiche, in denen ich nicht ganz sicher bin).Ein IoC-Container ist eine Singleton-Klasse (es kann jeweils nur eine Instanz instanziiert werden), in der die spezifische Art der Instanziierung von Objekten dieser Klasse für dieses Projekt registriert werden kann.Hier ist ein Link zu einem Beispiel dessen, was ich beschreiben möchte, zusammen mit der Klassendefinition für den IoC-Container, den ich verwendet habe

An diesem Punkt versuche ich, den IoC-Container für kompliziertere Szenarien zu verwenden. Aus heutiger Sicht ist die Verwendung des IoC-Containers auf eine Has-A-Beziehung für nahezu jede Klasse beschränkt, die ich erstellen möchte und deren Abhängigkeiten im IoC-Container definiert werden sollen. Was ist, wenn ich eine Klasse erstellen möchte, die eine Klasse erbt, aber nur, wenn die übergeordnete Klasse auf eine bestimmte Weise erstellt wurde und im IoC-Container registriert wurde?

Beispiel: Ich möchte eine untergeordnete Klasse von mysqli erstellen, diese Klasse jedoch im IoC-Container registrieren, um nur mit der übergeordneten Klasse zu instantiieren, die so erstellt wurde, wie ich sie zuvor im IoC-Container registriert habe. Ich kann mir keine Möglichkeit vorstellen, dies zu tun, ohne Code zu duplizieren (und da dies ein Lernprojekt ist, versuche ich, es so rein wie möglich zu halten).Hier sind einige weitere Beispiele für das, was ich zu beschreiben versuche.

Hier sind einige meiner Fragen:

Ist das, was ich versuche, möglich, ohne ein Prinzip von OOP zu brechen? Ich weiß, dass ich in c ++ dynamischen Speicher und einen Kopierkonstruktor verwenden könnte, um dies zu erreichen, aber ich konnte diese Art von Funktionalität in PHP nicht finden. (Ich gebe zu, dass ich nur sehr wenig Erfahrung mit einer der anderen magischen Methoden außer __construct habe, aber nach dem Lesen und __clone, wenn ich es richtig verstanden habe, konnte ich es im Konstruktor nicht verwenden, um die zu instanziierende Kinderklasse zu einem Klon einer zu machen Instanz der Elternklasse).Wohin sollten alle Definitionen meiner Abhängigkeitsklassen in Bezug auf die IoC gehen? (Sollte meine IoC.php nur eine Reihe von require_once ('dependencyClassDefinition.php') oben haben? Meine Bauchreaktion ist, dass es einen besseren Weg gibt, aber ich habe noch keinen gefunden.)In welcher Datei soll ich meine Objekte registrieren? Derzeit werden alle Aufrufe von IoC :: register () in der Datei IoC.php nach der Klassendefinition ausgeführt.Muss ich eine Abhängigkeit in der IoC registrieren, bevor ich eine Klasse registriere, die diese Abhängigkeit benötigt? Da ich die anonyme Funktion erst dann aufrufe, wenn ich tatsächlich ein im IoC registriertes Objekt instanziiere, gehe ich davon aus, dass dies kein Problem darstellt.Gibt es noch etwas, das ich übersehen habe und das ich tun oder benutzen sollte? Ich versuche, es Schritt für Schritt zu machen, aber ich möchte auch nicht wissen, dass mein Code wiederverwendbar ist und vor allem, dass jemand, der nichts über mein Projekt weiß, es lesen und verstehen kann.

Ich weiß, dass dies extrem lang ist, und wollte mich nur im Voraus bei allen bedanken, die sich die Zeit genommen haben, es zu lesen, und vor allem bei allen, die ihr Wissen teilen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage