Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: klasa komunikacji z bazą danych
Forum PHP.pl > Forum > PHP > Object-oriented programming
starach
Witam.
Mam kilka klas które komunikują się z różnymi typami baz danych.
Wszystkie klasy tworzone są na zasadzie singletonów.
Chciałbym napisać klasę nadrzędną DB która odpowiadała by za selekcję i użycie odpowiedniej klasy.
Przekazywałbym do konstruktora nazwę, powiedzmy MySQL wtedy klasa zwracała by obiekt klasy MySQL
jak to rozwiązać ? Chodzi tutaj o zapobiegnięciu edytowania wielu plików w razie rozrośnięcia się strony i zmiany bazy lub testów wydajnościowych na różnych bazach danych.
pbnan
Popatrz na przykłady ReflectionAPI w manualu (piękne to, w sam raz do frameworka) smile.gif
http://pl2.php.net/manual/pl/language.oop5.reflection.php
Konkretnie ReflectionClass i ReflectionObject chyba będą potrzebne smile.gif
starach
Hmm jakoś sobie nie mogę wyobrazić jak tego użyć rozwiązując ten problem.
reverse-engineering w tym przypadku chyba niespecjalnie się przyda.
Mógłbyś podać jakiś przykład ?

edit>
Coś mi się wydaje że jeśli zostanie tutaj użyte ReflectionAPI zaowocuje to znacznym spadkiem wydajności.
Wiesz ta dziedzina w PHP jest dosyć młoda i wolałbym nie eksperymentować z nią.

edit>>
Zwłaszcza że przy tworzeniu każdego obiektu DB będzie używane reflection.
pbnan
  1. <?php
  2. $main_db_class = new ReflectionClass('MysqliApiDB');
  3. $main_db_instance = $main_db_class->getStaticPropertyValue('$INSTANCE'); //to chyba zadziala na singleton :)
  4. ?>

Ogólnie popatrz, popróbuj, może zrezygnuj z singletonu (byłoby łatwiej)?

>>edit: zaraz Ci przytoczę kawałek o wydajności Reflection w PHP z PHPSolutions smile.gif Wait please...
>>>>A cholera, nie chce mi się szukać. Tak na szybko: spadek wydajności będzie niewielki, wiele frameworków korzysta z Reflection i nie jest to strasznie wolne.
Cytat
Zwłaszcza że przy tworzeniu każdego obiektu DB będzie używane reflection.

To twórz tych obiektów jak najmniej smile.gif Np. ja tworzę jeden dla wszystkich modeli wykorzystywanych w aplikacji (robię framework, trzeba się pochwalić czasem biggrin.gif).
starach
Zaraz chcesz mi powiedzieć że używając ReflectionAPI mogę uzyskać ten sam efekt co w przypadku singletonów ? Jeśli tak to masz może jakieś linki które prowadzą do dokumentacji gdzie jest opisane takie wykorzystanie Reflection ?

edit>
A no widzisz spadek wydajności jest nawet niewielki.
Może trochę przeginam z tą wydajnością ale przy 'sporym' serwisie spadek wydajności w jednym punkcie,
może być katastrofalny w skutkach. Zresztą co ja ci tutaj będę truł przecież piszesz framework ^^
Mógłbyś mi podać jakieś rozwiązanie niewykorzystujące ReflectionAPI ? plijz
pbnan
Cytat
Zaraz chcesz mi powiedzieć że używając ReflectionAPI mogę uzyskać ten sam efekt co w przypadku singletonów ? Jeśli tak to masz może jakieś linki które prowadzą do dokumentacji gdzie jest opisane takie wykorzystanie Reflection ?

Nie, nie chcę Ci tego powiedzieć. Możliwe, że tak się da, ale nie sądzę. Po prostu nie widzę jakiejś konkretnej przyczyny na stosowanie singletonów.

Cytat
Zresztą co ja ci tutaj będę truł przecież piszesz framework ^^

Nie ironizuj tongue.gif

Cytat
Mógłbyś mi podać jakieś rozwiązanie niewykorzystujące ReflectionAPI ? plijz

Naprawdę, jedyne, co mi na myśl przychodzi, to Reflection w takim przypadku...
UDAT
Cytat(orglee @ 5.04.2007, 18:26:26 ) *
Przekazywałbym do konstruktora nazwę, powiedzmy MySQL wtedy klasa zwracała by obiekt klasy MySQL
jak to rozwiązać ? Chodzi tutaj o zapobiegnięciu edytowania wielu plików w razie rozrośnięcia się strony i zmiany bazy lub testów wydajnościowych na różnych bazach danych.

Jeśli ci o to chodzi to możesz
a) stworzyć sobię metodę i wbić do niej na sztywno klasę obsługi konkretnego dialektu/rodzaju bazy danych
  1. <?php
  2. class DB {
  3. static public factory ( ) {
  4.  return new MySQL ( );
  5. }
  6. }
  7. ?>

b ) stworzyć klasę, która pośredniczyłaby w przekazywaniu połączenia do bazy
  1. <?php
  2. class DB {
  3.  static private $db;
  4.  
  5. static public register ( IDbConnection $db ) {
  6.  self:$db = $db;
  7. }
  8.  
  9. static public factory ( ) {
  10.  return self:$db;
  11. }  
  12. }
  13. ?>

Gdzie IDbConnection to interfejs klasy obsługującej połączenie do DB.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.