Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Obiektowa klasa do działania na bazie danych, Czy taka konwencja jest dobra, czy mozna to zrobić lepiej?
Sajrox
post 2.02.2008, 18:52:31
Post #1





Grupa: Zarejestrowani
Postów: 254
Pomógł: 7
Dołączył: 9.10.2007
Skąd: Poznań

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


Witam szanownych Panów smile.gif
W celu lepszego zrozumiania OOP w php, a mianowicie dziedzieczenia i interfejsów postanowiłem stworzyć mechanizm do wyciągania i dodawania rekordów do bazy danych. Oczywiście obecnie klasa nie wykonuje żadnych działań na bazie danych ,ale chodziło mi sam fakt zrozumiania wyżej wymienionych mechanizmów w OOP.
Moje pytanie do Was brzmi tak, czy konstrukcja tej klasy idzie w dobrym kierunku jeśli chodzi o OOP. Czy jednak moje rozumienie tej dziedziny nie jest zbyt dobre jeśli tak to jakie rozwiązania proponujecie aby lepiej zrozumieć tą kwestię.
Przeczytałem temat OOP. Interfejsy oraz klasy abstrakcyjne ale tutaj jest ogólnie poruszany temat OOP który trochę mi pomogł ale jednak nie do końca.
W tym temacie chce poruszyć tylko i wyłacznie obecną klasę którą za chwilę zaprezentuję a nie ogólne zagadnienia związane o OOP. Ewentualne propozycję mają dotyczyć tylko i wyłącznie tego kodu:

Klasa SQL:
  1. <?php
  2. interface DataBaseSelect
  3. {
  4. public function getAll();
  5. public function getRow();
  6. public function getValue($name);
  7. }
  8. interface DataBaseInsert
  9. {
  10. public function insertRow();
  11. }
  12. //#############################################################################
  13. abstract class SQL
  14. {
  15. private $table = NULL;
  16. private $fields = NULL;
  17. private $where = NULL;
  18.  
  19. public function setTable($table) {
  20. $this->table = ' FROM '.$table;
  21. }
  22.  
  23. public function setFields($fields) {
  24. $this->fields = $fields;
  25. }
  26.  
  27. public function setWhere($where) {
  28. $this->where = ' WHERE '.$where;
  29. }
  30.  
  31. public function getTable() {
  32. return $this->table;
  33. }
  34.  
  35. public function getFields() {
  36. return $this->fields;
  37. }
  38.  
  39. public function getWhere() {
  40. return $this->where;
  41. }
  42. }
  43. //#############################################################################
  44. class SelectData extends SQL implements DataBaseSelect
  45. {
  46. private $sql_type = 'SELECT ';
  47. private $sql = NULL;
  48.  
  49. public function __construct() {
  50. // Utworzenie pełnego zapytania sql
  51. $this->sql = $sql_type.parent::getFields().parent::getTable().$this->where;
  52. }
  53. public function getAll() {
  54. // Pobranie z bazy wszystkich rekordów
  55. $rows = 'wiele wyników';
  56. return $rows;
  57. }
  58.  
  59. public function getRow() {
  60. // Pobranie z bazy jednego rekordu
  61. $row = 'jeden wynik';
  62. return $row;
  63. }
  64.  
  65. public function getValue($name) {
  66. // Pobranie z bazy jednej wartośći
  67. $value = 'value';
  68. return $value;
  69. }
  70. }
  71. //#############################################################################
  72. class InsertData extends SQL implements DataBaseInsert
  73. {
  74. public function insertRow() {
  75. // Dodanie nowego rekordu do bazy
  76. $last_id = 1;
  77. return $last_id;
  78. }
  79. }
  80. //#############################################################################
  81. class CompileSQL implements DataBaseSelect, DataBaseInsert
  82. {
  83. public function __call($method, $args) {
  84. if ($method == 'setTable')
  85. SQL::setTable($args[0]);
  86. elseif ($method == 'setFields')
  87. SQL::setFields($args[0]);
  88. elseif ($method == 'setWhere')
  89. SQL::setWhere($args[0]);
  90. else
  91. echo '<i>Podana metoda: <b>'.$method.'</b> nie istnieje.</i><br />';
  92. }
  93.  
  94. public function getAll() {
  95. return SelectData::getAll();
  96. }
  97.  
  98. public function getRow() {
  99. return SelectData::getRow();
  100. }
  101.  
  102. public function getValue($name) {
  103. return SelectData::getValue($name);
  104. }
  105.  
  106. public function insertRow(){
  107. return SelectInsert::insertRow();
  108. }
  109. }
  110.  
  111. // przyklad wywolania
  112. $db = new CompileSQL();
  113. $db->setTable('products');
  114. $db->setFields('id, name, price');
  115. $db->setWhere('id = 1');
  116. $db->setOrderBy('name');
  117. echo $db->getRow();
  118.  
  119.  
  120. echo '<pre>';
  121. print_r($db);
  122. ?>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
splatch
post 2.02.2008, 19:03:33
Post #2





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

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


Polecam przyjrzenie się Creole + Jargon oraz JDBC.


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
Go to the top of the page
+Quote Post
Sajrox
post 2.02.2008, 19:09:38
Post #3





Grupa: Zarejestrowani
Postów: 254
Pomógł: 7
Dołączył: 9.10.2007
Skąd: Poznań

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


Dzięki, na pewno się przyda. Tylko mi nie zalęzy na tym bo dostać gotową klasę do ręki i nadal nie rozumieć o co chodzi w OOP, ale na przykładzie mojej klasy zrozumieć dokładnie OOP.
Dokładnie, czy moja konstrukcja jest dobra albo nie i dlaczego.
Go to the top of the page
+Quote Post
splatch
post 5.02.2008, 01:08:46
Post #4





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

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


Jeśli chcesz budować zapytania używając obiektów użyj bardziej elastycznej struktury. Jeśli chcesz odczytywać dane to Creole jest bardzo dobrym miejscem na pozyskiwanie pomysłów.

Unikaj przede wszysykim wymuszonego dziedziczenia (użyj interfejsu i klas abstrakcyjnych).

Przykładowy diagram (machnięty na szybko):


Bardzo fajnie wygląda Criteria 2.0 z Propela. Przykłady prosto ze strony:
  1. <?php
  2.  
  3. $c = BookReviewPeer::createCriteria();
  4. $c->add(new EqualExpr(BookReviewPeer::REVIEW_DATE, new LiteralSql("current_date")));
  5.  
  6. // other examples also possible:
  7. $c->add(new EqualExpr(BookReviewPeer::REVIEW_DATE, new LiteralSql("(select max(review_date) from review)")));
  8.  
  9. $c = AuthorPeer::createCriteria();
  10. $c->add(new OrExpr(new EqualExpr(AuthorPeer::FIRST_NAME, "Leo"), 
  11.  new InExpr(AuthorPeer::LAST_NAME, array("Tolstoy", "Dostoevsky", "Bakhtin"))
  12. )
  13.  );
  14. ?>


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
Go to the top of the page
+Quote Post
itsme
post 11.02.2008, 18:08:31
Post #5





Grupa: Zarząd
Postów: 1 512
Pomógł: 2
Dołączył: 22.04.2002
Skąd: Koszalin




przenosze i daje tutaj


--------------------
brak sygnaturki rowniez jest sygnaturką
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: 14.08.2025 - 05:46