Cytat
Demonizowanie Singletona jest bezpodstawne. Wszystko zależy od tego kto go tworzy i co ma wykonywać. Ja osobiście korzystam z Singletonów nawet we frameworkach.
To, że ktoś zrobił coś we frameworku nie oznacza, że jest to poprawne rozwiązanie.
Demonizowanie singletona jest bardzo podstawne i w żadnym stopniu nie zależy od tego kto go tworzy i co ma wykonywać - singleton jest antywzorcem, ponieważ:
1. Przeczy paradygmatowi programowania obiektowego
2. Przeczy innym paradygmatom programowania jak odwrócone sterowanie (IoC) chociaż nie aż tak bardzo jak w przypadku pkt. 1
3. Niesamowicie utrudnia, o ile w niektórych przypadkach uniemożliwia napisanie porządnych testów jednostkowych, trzeba się czasami bardzo nakombinować, żeby napisać test jednostkowy klasy, która zależy od takiego singletona.
4. I teraz miazga dla singletona - singleton nie jest niczym innym, jak globalem - tak tak, singleton to "zmienna" globalna, jest realizowany za pomocą statycznej metody danej klasy natomiast z założenia jest czymś globalnym, a jak powszechnie wiadomo wszystko co globalne w językach obiektowych jest złem.
Porządną alternatywą dla singletona jest po prostu nieużywanie singletona, a poza tym to Registry, Service Container czy Service Locator - kwestia nazwy, idea wspólna.
Cytat
Wymagania:
tylko jedna instancja na całe wywołanie
dostęp z dowolnego miejsca w kodzie
brak zależności od innych klas, nie chcę instalować dodatkowych zależności jak np PHP DI
maksymalna uniwersalność, ma działać zarówno z kodem PHP 5.3 jaki i 7.1+
Niestety, ale przy głupich założeniach nie zrobisz nic porządnego. Skąd w ogóle takie bezsensowane wymaganie jak i 2? Co do 3 to nie bardzo rozumiem, zależności między klasami są czymś naturalnym, ponieważ nawet w rzeczywistości nic nie występuje samo, praktycznie każde "coś" oddziałuje z "czymś" innym. Problem pojawia się, gdy tych zależności robi się za dużo, ale wtedy przychodzą z pomocą odpowiednie techniki refaktoryzacji.
Wymaganie 1 można spokojnie spełnić bez singletona i bez service locatora za pomocą zwykłego DI i utworzenia instancji danej klasy w jakiejś wyższej warstwie.
Cytat
Jedyne co widzę sensownego w tej roli to Singleton i Dependency Injection.
Singleton przeczy DI, bo zamiast wstrzykiwać zależność po prostu odwołujesz się do statycznej metody innej klasy - takie jest założenie singletona.