Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sterownik Bazy danych
Forum PHP.pl > Forum > PHP > Object-oriented programming
Black-Berry
Kilka tygodni temu pisałem o obiektowości i moim rozumieniu singletonów. Moje rozumowanie zostało naprostowane za co teraz dziękuję smile.gif Prosze o ocenę tego co pisze teraz:

  1. <?php
  2. interface Db_Driver_Interface
  3. {
  4. public function __construct();
  5. public function __destruct();
  6. public function connect();
  7. public function disconnect();
  8. public function query($aQuery);
  9. public function fetchRow($aQueryResult = '');
  10. public function getResult();
  11. public function numRows($aQueryResult = '');
  12. public function affectedRows();
  13. public function insertId();
  14. public function freeResult($aQueryResult = '');
  15. public function getTotalQueriesCount();
  16. public function getTotalExecutionTime();
  17. }
  18. ?>


  1. <?php
  2. abstract class Db_Driver_Abstract
  3. {
  4. protected $dbHost;
  5. protected $dbUser;
  6. protected $dbPassword;
  7. protected $dbName;
  8. protected $totalQueries;
  9. protected $totalTime;
  10. protected $log;
  11.  
  12. public function __construct(Main_Settings $aSettings, Main_Log $aLog)
  13. {
  14. $this->dbHost = $aSettings->dbHost;
  15. $this->dbUser = $aSettings->dbUser;
  16. $this->dbName = $aSettings->dbName;
  17. $this->dbPassword = $aSettings->dbPassword;
  18. $this->totalQueries = 0;
  19. $this->totalTime = 0;
  20. $this->log = $aLog;
  21. }
  22. public function __destruct(){}
  23. public function numRows($aQueryResult = ''){}
  24. public function affectedRows(){}
  25. public function freeResult($aQueryResult = ''){}
  26. public function getTotalQueriesCount()
  27. {
  28. return $this->totalQueries;
  29. }
  30.  
  31. public function getTotalExecutionTime()
  32. {
  33. $total = round($this->totalTime, 5);
  34. return $total;
  35. }
  36.  
  37. public function logStatistics()
  38. {
  39. $this->log->addEntry(_SYSTEM_LOG_TOTAL_QUERIES_COUNT_, $this->getTotalQueriesCount(), NOTE);
  40. $this->log->addEntry(_SYSTEM_LOG_TOTAL_EXECUTION_TIME_, $this->getTotalExecutionTime() . 's', NOTE);
  41. }
  42. }
  43. ?>


  1. <?php
  2. class Db_Driver_Mysql extends Db_Driver_Abstract implements Db_Driver_Interface
  3. {
  4. private $connectId;
  5. private $queryResult;
  6.  
  7.  
  8. public function connect()
  9. {
  10. $this->connectId = @mysql_connect($this->dbHost, $this->dbUser, $this->dbPassword);
  11. if ($this->connectId) {
  12. $this->log->addEntry(_SYSTEM_LOG_DATABASE_HOST_CONNECTED_SUCCESSFULLY_, $this->dbHost, NOTE);
  13. $dbSelect = @mysql_select_db($this->dbName, $this->connectId);
  14. if (!$dbSelect) {
  15. throw new Exception(_ENGINE_CANT_SELECT_DATABASE_);
  16. mysql_close($this->connectId); 
  17. $this->log->addEntry(_SYSTEM_LOG_CAMT_SELECT_DATABASE_, $this->dbName, ERROR);
  18. return false;
  19. } else {
  20. $this->log->addEntry(_SYSTEM_LOG_DATABASE_SELECTED_SUCCESSFULLY_, $this->dbName, NOTE);
  21. return true;
  22. }
  23. } else {
  24. throw new Exception(_ENGINE_CANT_CONNECT_TO_DATABASE_);
  25. return false;
  26. }
  27. }
  28.  
  29. public function disconnect()
  30. {
  31. $dbClose = @mysql_close($this->connectId);
  32. if (!$dbClose) {
  33. throw new Exception(_ENGINE_CANT_CLOSE_DATABASE_);
  34. return false;
  35. } else {
  36. return true;
  37. }
  38. }
  39.  
  40. public function query($aQuery)
  41. {
  42. $start = get_micro_time();
  43. $this->queryResult = '';
  44. // $this->queryResult = @mysql_db_query($this->dbName, $aQuery, $this->connectId);
  45. // method below is mutch faster then above...
  46. $this->queryResult = @mysql_query( $aQuery);
  47. if(!$this->queryResult){
  48. $this->log->addEntry(_SYSTEM_LOG_CANT_EXECUTE_QUERY_, $aQuery .'('.mysql_error().')' , WARNING);
  49. return false;
  50. } else {
  51. $this->log->addEntry(_SYSTEM_LOG_QUERY_COMPLITED_SUCCESSFULLY_, $aQuery, NOTE);
  52. $this->totalQueries++;
  53. $this->totalTime += get_micro_time() - $start;
  54. return true;
  55. }
  56. }
  57.  
  58. public function fetchRow($aQueryResult='')
  59. {
  60. $queryResult = (empty($aQueryResult)) ? $this->queryResult : $aQueryResult;
  61. $array = mysql_fetch_array($queryResult, MYSQL_ASSOC);
  62. if(!$array){
  63. return false;
  64. }else{
  65. return $array;
  66. }
  67. }
  68.  
  69. function insertId()
  70. {
  71. return mysql_insert_id($this ->connectId);
  72. }
  73.  
  74. public function numRows($aQueryResult = '')
  75. {
  76. $queryResult = (empty($aQueryResult)) ? $this->queryResult : $aQueryResult;
  77. $numrows = mysql_num_rows($queryResult);
  78. if(!$numrows)
  79. {
  80. return false;
  81. }else{
  82. return $numrows;
  83. }
  84. }
  85.  
  86. public function getResult()
  87. {
  88. return $this->queryResult;
  89. }
  90. ?>


Logka teg jest taka, że mam interface i abstrakcje klasy po której dziedzicza inne sterowniki. Przykład sterownka dla mysql. Zastanawiam się czy jeśli napisze później sterownik na inną bazę to czy wszystkie zapytania zostaną wykonane ?

Jeszcze jedno pytanie dotyczące funkcji mysql_db_query. Dlaczego jest ona w moim przykładzie o wiele wolniejsza niż mysql_query? (komentarz w klasie).

No i najważniejsze czy waszym zdaniem wszystko jest zrobione tak jak należy ?
Sedziwoj
a nie powinno być:
  1. <?php
  2. abstract class Db_Driver_Abstract implements Db_Driver_Interface{
  3. ...
  4. ?>

Nie zostawiaj metod z pustym ciałem {}, jak już to to co w abstrakcyjnej nie zdefiniowałeś z interfejsu jest domyślnie wymagane w implementacji konkretnej. Jak w abstrakcji chcesz dodać nową metodę którą muszą implementować dziedziczące robisz:
  1. <?php
  2. abstract public/protected function nazwaFunkcji( parametLubBrak );
  3. ?>
Black-Berry
@Sedziewoj: Racja. Zapomniałem wykończyć a klasę. (Te puste funkcje to pozostałość po pisaniu). Wstawiłem puste bo nie do końca byłem pewien czy będę ich wogóle używał. Okazuje się, że raczej nie, więc chyba całkiem wywale.
pkarw
Hej ciekawy pomysł. Pracujemy nad czymś podobnym ale o dużo większej funkcjonalności: http://code.google.com/p/ganglib

Może chcielibyście dołączyć jako kontrybutorzy?
Black-Berry
Ja chyba mam za małe doświadczenie w ZFramework i trochę mało czasu żeby wam pomóc ale może Sedziwoj się zgodzi smile.gif Pozdrawam.
Sedziwoj
Cytat(Black-Berry @ 14.05.2008, 17:00:30 ) *
Ja chyba mam za małe doświadczenie w ZFramework i trochę mało czasu żeby wam pomóc ale może Sedziwoj się zgodzi smile.gif Pozdrawam.


Doświadczenie to nie problem, właśnie w takich projektach dobrze jest zdobywać, bo zawsze ktoś coś Ci powie jak coś będzie nie tak, a samemu to samokrytyka to rzadkość.
Ja też nie znam Zend FW, ale ja założę się mam mniej czasu na zabawę, więc nawet jakbym chciał to nie mam czasu (nie licząc chwilowego braku netu w domu :/ ), mam parę rzeczy do Propel do dokumentacji i nie mogę się zebrać od miesięcy aby wysłać komu trzeba.
Cysiaczek
@pkarw - Nie rób tak więcej - nie spamuj. Szukasz kogoś do projektu? Dobrze, ale od tego jest dział na forum i tam Ciebie odsyłam.
Whisller
Już pomijając samą klasę - chociaż o jednym muszę spojrzeć co mnie uderzyło po oczach "@mysql_connect" sic! wyjątki, gdzie wyjątki tongue.gif - po co pisać taką klasę?
Mamy PDO jest także creole, więc jaki jest sens, cel pisania czegoś takiego na własną rekę? Swoją energię warto by poświęcić na napisanie jakiejś aplikacji aniżeli wymyślać koło na nowo, no ale jest to tylko moje zdanie.
Black-Berry
Ja poprostu lubię mieć rzeczy po swojemy bo wtedy jak przyjdzie mi coś zmienić albo dodać to od razu wiem gdzie co jest. Np gdybym chciał dodać cache - własna klasa byłaby wskazana. Chyba więcej czasu zajmie mi przeszukanie dokumentacji do jakiejś biblioteki zewnętrznej niż napisanie takiej własnej. Ta zajeła mi najwyżej 2h.
DeyV
Black - to nie jest do końca zdrowe podejście. Praca programisty to w 90% czasu właśnie analiza dokumentacji. Im szybciej się do tego przyzwyczaisz i tego nauczysz, tym łatwiej będzie Ci w przyszłości pracować z zespole z innymi programistami, gdybyś miał taki zamiar...

Tym bardziej, że np. korzyści z korzystania z zaimplementowanej i napisanej w natywnym kodzie klasy PDO to nie tylko korzystanie ze sprawdzonego rozwiązania, ale również znaczne przyśpieszenie czasu wykonywania skryptów, gdyż PDO jest po prostu znacznie szybsze, niż MySQL connetc.

I jeszcze jedna dobra informacja - nie wiem czy wiesz, ale możesz napisać własną nakładkę na PDO, w stylu MyPDO extends PDO i dopisać sobie brakujące metody lub nadpisać istniejące. To jest dopiero fajna funkcjonalność PHP5!
mike
Cytat(Black-Berry @ 16.05.2008, 10:18:34 ) *
Ja poprostu lubię mieć rzeczy po swojemy bo wtedy jak przyjdzie mi coś zmienić albo dodać to od razu wiem gdzie co jest. Np gdybym chciał dodać cache - własna klasa byłaby wskazana. Chyba więcej czasu zajmie mi przeszukanie dokumentacji do jakiejś biblioteki zewnętrznej niż napisanie takiej własnej. Ta zajeła mi najwyżej 2h.
To teraz spójrz na to z innej strony. Piszesz własny projekt i zapraszasz kogoś do pomocy/współpracy.
I jak myślisz co zajmie mniej czasu tej osobie przeczytanie dokumentacji i nauczenie się API czy przeglądanie Twoich wypocin?

Musisz spojrzeć na zagadnienie programowania trochę szerzej.
Black-Berry
No pewnie znowu macie rację ale ja dopiero co nawróciłem się na obiekty snitch.gif Jeszcze 2 miesiące temu chciałem wszystko pisać proceduralnie a miesiąc temu stosować singletony...

Jedno pytanie odnośnie PDO: Jak bardzo jest ono szybsze? Rozumiem, że to wbudowana klasa w PHP taka jak np exception tak?

Jeszcze jedno mi w tym wszystkim nie pasuje... Skoro coś takiego istnieje to po co ten cały pomysł z biblioteką gangbang czy ganglib questionmark.gif
ayeo
Witam!
Ja też lubię mieć wszystko po swojemu. Wiem, że z komercyjnego punktu widzenia nie jest to dobre podejście. Sam nie dorównasz projektom rozwijanym przez lata przez wielu ludzi (z wielkim doświadczeniem) i wyspecjalizowanych w jednej rzeczy (np. Samrty). Jednak pisząc, dajmy na to parser szablonów, wymyślasz może koło od nowa, ale uczysz się wielu rzeczy przy okazji! To tak jakbyś kazał zapalonemu mechanikow-konstruktorowi budującemu swój pojazd (za duże pieniądze) poradził, żeby kupił sobie z salonu z bajerami... Póki programowanie to pasja, a nie źródło dochodu uważam, że wynajdywanie koła od nowa ma jaknajbardziej sens.
Pozdrawiam!
pkarw
Hej czytając te posty tym bardziej stwierdzam, że ganglib może się okazać przydatny. Stanowi lekkąabstrackję (z założenia lżejszą niżPEAR_DB czy też Zend_DB) nad PDO - ale może też używać natywnych funkcji mysql. Dodatkowo obsługuje standardowo cache o ustalonych parametrach. Może zamiast pisać nową bibliotekę warto byłoby współuczestniczyć w naszym projekcie? Lub nawet używać go i rozwijać dla własnych celów (np. jako odgałęzienie).

http://code.google.com/p/ganglib
itsme
Cytat(pkarw @ 16.05.2008, 12:35:28 ) *
Hej czytając te posty tym bardziej stwierdzam, że ganglib może się okazać przydatny. Stanowi lekkąabstrackję (z założenia lżejszą niżPEAR_DB czy też Zend_DB) nad PDO - ale może też używać natywnych funkcji mysql. Dodatkowo obsługuje standardowo cache o ustalonych parametrach. Może zamiast pisać nową bibliotekę warto byłoby współuczestniczyć w naszym projekcie? Lub nawet używać go i rozwijać dla własnych celów (np. jako odgałęzienie).

http://code.google.com/p/ganglib


daj spokoj ze spamem.
WYstarczy raz na pisac na foruma nie wszedzie gdzie ttylko istanieje taka mozliwosc ...

wszysyc juz wiedza ze istanieje ganglib i koniec
kolejny post o nim niepowiazany zbytnio z tematem = warn
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.