Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP5] Rozszerzanie singletona?
MacDada
post
Post #1





Grupa: Zarejestrowani
Postów: 47
Pomógł: 1
Dołączył: 24.06.2010
Skąd: Sopot

Ostrzeżenie: (0%)
-----


Hej,

mam sobie klasę DB, która zajmuje się łączeniem z bazą danych oraz obsługą błędów. Gdy chcę zrobić coś z danymi tworzę nową klasę rozszerzającą klasę DB i w niej umieszczam odpowiednią metodę.

Zależy mi na możliwie dużej wydajności, stąd nie tworzę uniwersalnej klasy ze wszystkimi możliwymi metodami, ale każdy rodzaj działania na bazie wymaga oddzielnej klasy, żeby była ona możliwie najkrótsza.

Klasa DB:
http://wklej.to/O7pd

Przykładowa klasa pobierająca dane użytkownika:
http://wklej.to/Glmo

Przykładowe zastosowanie:
http://wklej.to/3TPK

Przykładowy wynik:
http://wklej.to/UOtk

Problem pojawia się, gdy chcę skorzystać z dwóch różnych operacji na bazie – niepotrzebnie wtedy uruchamiam dwie instancje klasy DB, czyli niepotrzebnie zajmuję pamięć i wielokrotnie łączę się z bazą zamiast skorzystać z jednego połączenia.

Chciałem zrobić klasę DB jako singleton i tu się pojawia pytanie:
czy mogę rozszerzać singletona? Jak to wtedy wywołać?

Chodzi o to, żeby mieć jedną instancję klasy bazowej DB, z którego korzystać może wiele innych klas ją rozszerzających.

Dzięki i pozdr.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
zegarek84
post
Post #2





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

Ostrzeżenie: (0%)
-----


jak masz takie same metody publiczne czy chronione u rodzica to nie musisz ich nadpisywać przy potomkach - dlatego potomek tutaj DB_getUser nie musiał mieć definicji __construct()...

jeśli chcesz mieć jeden uchwyt do a w zasadzie tworząc nowe instancje obiektu to daleko od singleton'a - jeśli tak chciałbyś zrobić to klasa bazy po prostu obsługuje bazę i instancje tej klasy przekazujesz innym klasom gdzie z db zwracasz uchwyt - oczywiście w modelu singleton klasę tworzy się tak by zawsze był zwracany stary obiekt a nie nowy [chyba, że nie istnieje...] - obiekt taki najczęściej jest zapamiętany w zmiennej statycznej...

ale na to co Ty zrobiłeś zamiast singleton'a to zrób deczko inny konstruktor i inaczej przechowuj zmienne i uchwyt do bazy - w zmiennych statycznych - jeśli one są ustawione to w konstruktorze nic nie rób... w metodach uchwyt do bazy odwołuj się do zmiennej statycznej - oczywiście zdefiniuj je u najwyższego rodzica by potomkowie mieli także dostęp do tych zmiennych statycznych...
czyli zamiast:
  1. class DB
  2. {
  3. protected $connection;
  4. protected $_printExceptions;
  5.  
  6. public function __construct($db, $printExceptions=FALSE)
  7. {
  8. $this->_printExceptions = $printExceptions;
  9.  
  10. try
  11. {
  12. $this->connection = new PDO('mysql:host='.$db['host'].'; port='.$db['port'].'; dbname='.$db['name'], $db['user'], $db['pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  13.  
  14. $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  15. }
  16. catch(PDOException $e)
  17. {
  18. $this->_handleException($e, 'Database class exception while connecting to the database:');
  19. }
  20. }
  21. }

możesz zrobić:
  1. class DB
  2. {
  3. protected static $connection;
  4. protected static $_printExceptions;
  5.  
  6. public function __construct($db, $printExceptions=FALSE)
  7. {
  8. if(!isset(self::$connection)){
  9. self::$_printExceptions = $printExceptions;
  10.  
  11. try
  12. {
  13. self::$connection = new PDO('mysql:host='.$db['host'].'; port='.$db['port'].'; dbname='.$db['name'], $db['user'], $db['pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  14.  
  15. self::$connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  16. }
  17. catch(PDOException $e)
  18. {
  19. $this->_handleException($e, 'Database class exception while connecting to the database:');
  20. }
  21. }
  22. }
  23. }

no i oczywiście uchwyt do bazy we wszystkich klasach także potomnych masz pod self::$connection

Ten post edytował zegarek84 9.08.2010, 11:12:02
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 10.06.2026 - 12:13