W jaki sposób organizujesz i zarządzasz obiektami pomocniczymi, takimi jak silnik bazy danych, powiadamianie użytkownika, obsługa błędów itp. W projekcie obiektowym opartym na PHP?
Powiedzmy, że mam duży PHP CMS. CMS jest zorganizowany w różnych klasach. Kilka przykładów:
- obiekt bazy danych
- Zarządzanie użytkownikami
- API do tworzenia / modyfikowania / usuwania elementów
- obiekt wiadomości służący do wyświetlania komunikatów dla użytkownika końcowego
- moduł obsługi kontekstu, który przenosi Cię na właściwą stronę
- klasa paska nawigacji, która wyświetla przyciski
- obiekt rejestrowania
- ewentualnie niestandardowa obsługa błędów
itp.
Mam do czynienia z odwiecznym pytaniem, jak najlepiej udostępnić te obiekty każdej części systemu, która tego potrzebuje.
Moje pierwsze rozwiązanie, wiele lat temu, polegało na stworzeniu globalnej aplikacji $ application zawierającej zainicjowane instancje tych klas.
global $application;
$application->messageHandler->addMessage("Item successfully inserted");
Następnie przeszedłem na wzór Singleton i funkcję fabryczną:
$mh =&factory("messageHandler");
$mh->addMessage("Item successfully inserted");
ale to też mi się nie podoba. Testy jednostkowe i hermetyzacja stają się dla mnie coraz ważniejsze, aw moim rozumieniu logika stojąca za globalnymi / singletonami niszczy podstawową ideę OOP.
Wtedy oczywiście istnieje możliwość nadania każdemu obiektowi szeregu wskaźników do potrzebnych mu obiektów pomocniczych, prawdopodobnie w najczystszy, oszczędzający zasoby i przyjazny dla testowania sposób, ale mam wątpliwości co do możliwości utrzymania tego w dłuższej perspektywie.
Większość frameworków PHP, które przyjrzałem się, używa wzorca singleton lub funkcji, które mają dostęp do zainicjowanych obiektów. Oba dobre podejścia, ale jak powiedziałem, nie jestem zadowolony z żadnego.
Chciałbym poszerzyć swoje horyzonty dotyczące tego, jakie wspólne wzorce istnieją tutaj. Szukam przykładów, dodatkowych pomysłów i wskazówek dotyczących zasobów, które omawiają to z długoterminowej , rzeczywistej perspektywy.
Interesują mnie również specjalistyczne, niszowe lub po prostu dziwne podejścia do problemu.
$mh=&factory("messageHandler");
jest bezcelowe i nie daje żadnych korzyści wydajnościowych. Ponadto jest to przestarzałe w 5.3.