Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obiektowa klasa do działania na bazie danych
Forum PHP.pl > Forum > PHP > Object-oriented programming
Sajrox
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. ?>
splatch
Polecam przyjrzenie się Creole + Jargon oraz JDBC.
Sajrox
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.
splatch
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. ?>
itsme
przenosze i daje tutaj
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.