Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> klasa komunikacji z bazą danych, niezależna od typu bazy DB -> MySQL or DB->else
starach
post 5.04.2007, 17:26:26
Post #1





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


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.
Go to the top of the page
+Quote Post
pbnan
post 5.04.2007, 17:41:11
Post #2





Grupa: Zarejestrowani
Postów: 174
Pomógł: 0
Dołączył: 27.03.2007
Skąd: Osiek almost City ;-D

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


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

Ten post edytował pbnan 5.04.2007, 17:44:58


--------------------
"Hmmm, na wakacje trzeba będzie zacząć zarabiać, co nie? ;-] GTA IV się coraz bardziej zbliża... ;-]"
To się nazywa częsty update sygnaturki.
;-)
Go to the top of the page
+Quote Post
starach
post 5.04.2007, 18:03:01
Post #3





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


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.

Ten post edytował orglee 5.04.2007, 18:08:47
Go to the top of the page
+Quote Post
pbnan
post 5.04.2007, 18:09:39
Post #4





Grupa: Zarejestrowani
Postów: 174
Pomógł: 0
Dołączył: 27.03.2007
Skąd: Osiek almost City ;-D

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


  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).

Ten post edytował pbnan 5.04.2007, 18:14:17


--------------------
"Hmmm, na wakacje trzeba będzie zacząć zarabiać, co nie? ;-] GTA IV się coraz bardziej zbliża... ;-]"
To się nazywa częsty update sygnaturki.
;-)
Go to the top of the page
+Quote Post
starach
post 5.04.2007, 18:17:01
Post #5





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


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

Ten post edytował orglee 5.04.2007, 18:20:28
Go to the top of the page
+Quote Post
pbnan
post 5.04.2007, 18:26:04
Post #6





Grupa: Zarejestrowani
Postów: 174
Pomógł: 0
Dołączył: 27.03.2007
Skąd: Osiek almost City ;-D

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


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...


--------------------
"Hmmm, na wakacje trzeba będzie zacząć zarabiać, co nie? ;-] GTA IV się coraz bardziej zbliża... ;-]"
To się nazywa częsty update sygnaturki.
;-)
Go to the top of the page
+Quote Post
UDAT
post 6.04.2007, 08:26:15
Post #7





Grupa: Zarejestrowani
Postów: 442
Pomógł: 0
Dołączył: 27.12.2005

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


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.
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 20.07.2025 - 08:40