Zrozumienie kontenerów IoC i zastrzyków zależności

Szybkie przewijanie do przodu:

Piszę to z zamiarem lepszego zrozumienia wtrysku zależności i kontenerów IoC, ale także po to, aby potem poprawić błędy w nim i użyć go, aby pomóc nauczyć kilku moich znajomych o nich.

W tej chwili próbowałem czytać dokumentację dla różnych frameworków (laravel, fuel, codeigniter, symfony) i odkryłem, że było zbyt wiele różnych aspektów frameworków, których potrzebowałem, aby czuć się komfortowo, korzystając z tego, że postanowiłem spróbować po prostu naucz się każdego z głównych elementów indywidualnie na własną rękę, zanim spróbujesz użyć ich w samych ramach.

Spędziłem wiele godzin na szukaniu różnych znaczeń, przeglądaniu odpowiedzi na temat stackoverflow i czytaniu różnych artykułów próbujących zrozumieć, czym jest IoC i jak go używać do prawidłowego zarządzania zależnościami, i wierzę, że rozumiem, co to jest koncepcja, ale wciąż jestem szary na temat prawidłowego wdrożenia.Myślę, że najlepszym sposobem, aby ktoś czytający to pomógł mi, jest podanie mojego obecnego rozumienia kontenerów IoC i wstrzykiwania zależności, a następnie niech ludzie, którzy mają lepsze zrozumienie niż ja, wskażą, gdzie moje zrozumienie nie jest wystarczające.

Moje zrozumienie:

Zależność występuje wtedy, gdy instancja klasy ClassA wymaga instancji klasy ClassB w celu utworzenia instancji nowej instancji klasy ClassA.Wstrzyknięcie zależności następuje, gdy ClassA jest przekazywana instancji ClassB, albo przez parametr w konstruktorze ClassA, albo przez funkcję set ~ DependencyNameHere ~ (~ DependencyNameHere ~ $ param).(To jeden z obszarów, w których nie jestem całkowicie pewien).Kontener IoC jest klasą singleton (może mieć tylko 1 instancję instancji w danym momencie), w której można zarejestrować konkretny sposób tworzenia instancji obiektów tej klasy dla tego projektu.Oto link do przykładu tego, co próbuję opisać wraz z definicją klasy kontenera IoC, którego używałem

W tym momencie zaczynam próbować używać kontenera IoC do bardziej skomplikowanych scenariuszy. Na razie wydaje się, że aby użyć kontenera IoC, ograniczam się do relacji has-a dla prawie każdej klasy, którą chcę utworzyć, która ma zależności, które chce zdefiniować w kontenerze IoC. Co zrobić, jeśli chcę utworzyć klasę dziedziczącą klasę, ale tylko wtedy, gdy klasa nadrzędna została utworzona w określony sposób, została zarejestrowana w kontenerze IoC.

Na przykład: Chcę utworzyć klasę potomną mysqli, ale chcę zarejestrować tę klasę w kontenerze IoC, aby utworzyć instancję tylko z klasą nadrzędną skonstruowaną w sposób, który wcześniej zarejestrowałem w kontenerze IoC. Nie mogę wymyślić sposobu, aby to zrobić bez powielania kodu (a ponieważ jest to projekt edukacyjny, staram się zachować go jako „czysty”, jak to możliwe).Oto kilka przykładów tego, co próbuję opisać.

Oto niektóre z moich pytań:

Czy to, co próbuję zrobić powyżej, jest możliwe bez złamania zasady OOP? Wiem w c ++, że mógłbym użyć pamięci dynamicznej i konstruktora kopii, aby to osiągnąć, ale nie byłem w stanie znaleźć tego rodzaju funkcjonalności w php. (Przyznaję, że mam bardzo małe doświadczenie w używaniu innych metod magicznych oprócz __construct, ale z czytania i __clone, jeśli dobrze zrozumiałem, nie mogłem użyć w konstruktorze, aby utworzyć klasę potomną jako klon instancji instancja klasy nadrzędnej).Gdzie powinny być wszystkie moje definicje klas zależności w stosunku do IoC? (Czy mój IoC.php powinien mieć tylko kilka require_once ('dependencyClassDefinition.php') na górze? Moja reakcja jest taka, że ​​jest lepszy sposób, ale jeszcze nie wymyśliłem takiego)W jakim pliku powinienem rejestrować swoje obiekty? Obecnie wykonuję wszystkie wywołania do IoC :: register () w pliku IoC.php po definicji klasy.Czy muszę zarejestrować zależność w IoC, zanim zarejestruję klasę wymagającą tej zależności? Ponieważ nie wywołuję funkcji anonimowej, dopóki nie utworzę instancji obiektu zarejestrowanego w IoC, zgaduję, że nie, ale nadal jest to problem.Czy jest coś, o czym mi pomijam, co powinienem robić lub używać? Próbuję zrobić to krok po kroku, ale nie chcę też wiedzieć, że mój kod będzie można ponownie wykorzystać i, co najważniejsze, że ktoś, kto nic nie wie o moim projekcie, może go przeczytać i zrozumieć.

Wiem, że to bardzo długo i chciałem z góry podziękować każdemu, kto poświęcił czas na jego przeczytanie, a tym bardziej każdemu, kto dzieli się swoją wiedzą.

questionAnswers(1)

yourAnswerToTheQuestion