Ale tych singletonów Ci się narobi w kodzie:)
Chcesz klasę do obsługi dwóch akcji: logowania i sprawdzania czy ktoś jest zalogowany . Do tego dodaj sobie jeszcze dwie akcje: wylogowanie i zwracanie zalogowanego użytkownika, bo jest to wszystko logicznie ze sobą powiązane. Jednym słowem potrzebujesz klasy do obsługi autoryzacji:
class Authorization {
public function login($login, $password);
public function logout();
public function isLogged(); //zwraca true, jeżeli jest ktoś zalogowany, false w innym wypadku
public function getLoggedUser(); //zwraca zalogowanego użytkownika
}
Do pełnej funkcjonalności są ci potrzebne jeszcze klasy do obsługi sesji, opcjonalnie cookie i do obsługi połączeń z bazą.
Żadna z tych klas nie powinna być singletonem, ponieważ nie ma ku temu żadnych powodów.
Klasy do obsługi sesji i ciasteczek i tak korzystają z globalnych tablic, więc po co ci implementowanie ich jako singletonów? Po to, żeby było:
Session::getInstance()->method();
Zamiast:
$session = new Session();
$session->method();
A co do połączeń z bazą, to już tym bardziej jest to nie logiczne, bo co w przypadku, gdy będziesz obsługiwał x połączeń z różnymi bazami?
Sama aplikacja (czy też system, czy jak to tam nazwiesz) również nie ma żadnego większego powodu, żeby była singletonem, bo po co? Zastosowanie wzorca ma sens, wtedy i tylko wtedy, gdy ma sens:) Jeżeli nie ma żadnego logicznego uzasadnienia do używania wzorca, to się tego nie robi. Nawet jeżeli tworzysz zazwyczaj (albo nawet zawsze) tylko jeden obiekt danej klasy, to nie jest to żadnym uzasadnieniem do stosowania singletonu. Singleton stosujesz wtedy, gdy nie może być dwóch obiektów tego samego typu.