Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Początki z programowaniem obiektowym - klasa artykuł, Proszę o opinie sugestie
czarek1986
post
Post #1





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 15.09.2008

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


Witam

Od jakiegoś czasu interesuje się programowaniem obiektowym, ale od niedawna zdecydowałem się stworzyć coś własnego. Będzie to mój pierwszy obiektowy (przynajmniej w części) CMS. chciałbym przedstawić wam klasę artykułu do oceny. Prosze o konstruktywną krytykę (IMG:style_emoticons/default/smile.gif)

  1. <?php
  2.  
  3. class Artykul {
  4.  
  5. //zawiera unikalny numer identyfikujący artykuł w bazie danych
  6. private $id;
  7. //zawiera nazwę autora tworzacego artykuł
  8. private $autor;
  9. //zawiera nazwę kategorii do której przyporządkowany jest artykuł
  10. private $kategoria;
  11. //zaiwera tytuł artykułu
  12. private $tytul;
  13. //zawiera wstępny tekst artykułu
  14. private $naglowek;
  15. //zawiera główną treść artykułu
  16. private $tekst_artykulu;
  17. //zawiera datę utworzenia artykułu !!Unixowy znacznik czasu
  18. private $utworzony;
  19. //zawiera datę ostatniej modyfikacji artykułu !!Unixowy znacznik czasu
  20. private $zmodyfikowany;
  21. //zawiera datę ostatniej publikacji artykułu !!Unixowy znacznik czasu
  22. private $opublikowany;
  23. //określa czy artykuł jest nowo utworzony, czy został wczytany z bazy danych
  24. private $new;
  25.  
  26.  
  27.  
  28. public function __construct($id=NULL)
  29. {
  30. if($id)
  31. {
  32. $this->id_art = $id;
  33. $db = Database::GetInstance();
  34. $sql = "SELECT *
  35. FROM j_artykuly
  36. WHERE id = $id";
  37.  
  38. $art = $db->select($sql);
  39.  
  40. if(!$art)
  41. throw new Exception('Wybrany artykuł nie istnieje');
  42.  
  43. $this->new = false;
  44. $this->set($art[0]);
  45.  
  46. }
  47. else
  48. $this->new = true;
  49.  
  50. }
  51.  
  52. /**
  53. * Metoda zwraca wartość jednego wybranego pola klasy
  54. *
  55. * @param name - nazwa pola w klasie, której wartość chcemy uzyskać
  56. **/
  57.  
  58. public function getOne($name)
  59. {
  60. if(property_exists(get_Class($this), $name))
  61. return $this->$name;
  62. else
  63. throw new Exception('Klasa '.get_class($this).' nie posiada pola '.$name);
  64. }
  65.  
  66. /**
  67. *
  68. * Metoda zwraca wartości wszystkich pól klasy
  69. *
  70. * @return tablica z danymi wszystkich pól;
  71. *
  72. **/
  73.  
  74. public function getAll()
  75. {
  76.  
  77. $arData = array(
  78. 'id' => $this->id,
  79. 'autor' => $this->autor,
  80. 'kategoria' => $this->kategoria,
  81. 'tytul' => $this->tytul,
  82. 'naglowek' => $this->naglowek,
  83. 'tekst_artykulu' => $this->tekst_artykulu,
  84. 'utworzony' => $this->utworzony,
  85. 'zmodyfikowany' => $this->zmodyfikowany,
  86. 'opublikowany' => $this->opublikowany,
  87. );
  88.  
  89. return $arData;
  90. }
  91.  
  92.  
  93. /**
  94. *
  95. * Metoda służy do ustawienia wartości pól w klasie
  96. *
  97. [email="*@Param"]*@Param[/email] arData- tablica przechowująca nazwy pól i odpowiadające im wartości
  98. *
  99. **/
  100.  
  101. public function set(array $arData)
  102. {
  103. foreach($arData as $key => $value)
  104. {
  105. if($key == 'id' && $this->new)
  106. throw new Exception("Wartość pola 'id' może być nadana tylko automatycznie");
  107.  
  108. if(property_exists(get_Class($this), $key))
  109. {
  110. $this->$key = $value;
  111. }
  112. else
  113. throw new Exception('Klasa '.get_class($this).' nie posiada pola '.$key);
  114. }
  115. }
  116.  
  117.  
  118.  
  119. /**
  120. *
  121. * Metoda Tworząca artykuł w bazie danych
  122. *
  123. **/
  124.  
  125. public function createArt()
  126. {
  127. if($this->new)
  128. {
  129. $this->checkRequiredData();
  130.  
  131. $db = Database::getInstance();
  132. if($db->Insert('j_artykuly', $this->getAll()) > 0);
  133. return true;
  134. }
  135.  
  136. throw new Exception('Bierzący artykuł już istnieje w bazie danych. Można go tylko zaktualizować');
  137. }
  138.  
  139.  
  140. /**
  141. *
  142. * Metoda aktualizująca dane artykułu w bazie danych
  143. *
  144. **/
  145.  
  146. public function updateArt()
  147. {
  148. if(!$this->new)
  149. {
  150. $this->checkRequiredData();
  151.  
  152. $db = Database::getInstance();
  153. $arConditions['id']=$this->id;
  154. if($db->Update('j_artykuly', $this->getAll(), $arConditions) > 0);
  155. return true;
  156. }
  157.  
  158. throw new Exception('Musisz najpierw utworzyć artykuł w bazie danych aby móc go edytować');
  159. }
  160.  
  161.  
  162. /**
  163. *
  164. * Metoda usuwająca artykuł z bazy danych
  165. *
  166. **/
  167.  
  168. public function delArt()
  169. {
  170. if(!$this->new)
  171. {
  172. $this->checkRequiredData();
  173.  
  174. $db = Database::getInstance();
  175. $arWhere = array("id = ".$this->id);
  176. if($db->delete('j_artykuly', $arWhere) > 0)
  177. return true;
  178. }
  179.  
  180. throw new Exception('Nie można usunąć bierzącego artykułu, ponieważ nie został jeszcze zapisany w bazie danych.');
  181. }
  182.  
  183.  
  184. /**
  185. *
  186. * Metoda sprawdzająca czy pola, które nie mogą być puste w bazie danych, są wypełnione danymi
  187. *
  188. **/
  189.  
  190. private function checkRequiredData()
  191. {
  192. $arData = array();
  193. $arData = $this->getAll();
  194. $arEmpty = array();
  195. foreach($arData as $key => $value)
  196. {
  197. if($key=='autor' || $key=='kategoria' || $key=='tytul' || $key=='naglowek' || $key=='utworzony')
  198. {
  199. if(!$value)
  200. $arEmpty[]=$key;
  201. }
  202. }
  203.  
  204. if(count($arEmpty) > 0)
  205. {
  206. $empty = implode(', ', $arEmpty);
  207. throw new Exception('Wymagane pola '.$empty.' są puste.');
  208. }
  209.  
  210. return true;
  211. }
  212.  
  213.  
  214. }
  215.  
  216. ?>


Ten post edytował erix 25.08.2009, 11:26:21
Powód edycji: [erix] przeniosłem
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




A po co dodatkowy parametr new? ID w zupełności go zastępuje (IMG:style_emoticons/default/smile.gif) W końcu jeśli jest tam NULL, to spełnia on tę samą rolę. Sprawdzasz więc jedynie jaką wartość ma ID i w razie czego podejmujesz decyzję czy robić UPDATE czy INSERT w bazie. To sprawia, że createArt i updateArt możesz zastąpić jedną metodą. Konstruktor w zasadzie działałby podobnie. Brak id -> nowy z wartościami domyślnymi, prawidłowe id -> pobiera artykuł, nieprawidłowe id -> nowy + error. Kwestia funkcji do wyświetlania wszystkiego jest tak naprawdę sporna. Można użyć funkcji getOne, ale używanie funkcji w funkcji to zawsze minimalny narzut czasowy przy wykonywaniu. Więc patrząc od strony wydajności odwołanie się prosto do obiektu pozwala na ominięcie tworzenia zmiennych tymczasowych, odwołania do funkcji, powrotu do funkcji macierzystej, niszczenie zmiennych tymczasowych na stosie itp. Nie jest więc takie głupie jak się może wydawać bo oszczędza nam zarówno czas jak i pamięć serwera. Poza tym popatrz na getOne... Wywołujesz w niej za każdym razem funkcje i warunki. To spowalniałoby getAll za każdym razem.
Zastanawiałbym się także nad kategoria i tagi. Wszystko zależnie od tego jak masz zamiar rozwiązać to od strony bazy. Do przemyślenia jest bowiem choćby to, czy artykuł może być dodany do jednej, czy wielu kategorii. Bo jeśli do wielu to musisz nieco inaczej zapytania popisać. To samo tyczyło by ewentualnego dodania do klasy zmiennej dotyczącej tagów.
Go to the top of the page
+Quote Post

Posty w temacie


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 Aktualny czas: 6.10.2025 - 20:02