Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Klasa news - czy to można nazwać OOP?
adriano321
post
Post #1





Grupa: Zarejestrowani
Postów: 17
Pomógł: 1
Dołączył: 24.01.2007

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


Jestem dopiero co zaczynającym "programistą" (haha) PHP. Programowanie proceduralne nie sprawia mi już większych kłopotów więc chcę wkroczyć na wyższy poziom. Niestety same podstawy tj. teoria nie wystarczy, żeby napisać coś samemu czyt. dobrze napisać. Więc tu się zwracam z prośbą do Was: Czy to coś poniżej ma jakiś związek z OOP? I czy z własnych doświadczeń możecie coś zaproponować, jakieś rozwiązania dalsze?

Klasa ObsługaNewsa z założenia ma być dostępna tylko z poziomu panelu administracyjnego.

Kolejne pytanie:
Jak rozwiązać problem wyświetlania kilku newsów na jednej stronie? Utworzyć kilka egzemplarzy klasy News? Tu zastanawiam się jak zrobić to, aby wykonać tylko jedno zapytanie do bazy danych?

Czy można się w jakiś sposób pozbyć dodawania $db w parametrach metod??

  1. <?php
  2. class News {
  3.  
  4. public $id;
  5. public $tytul;
  6. public $tresc;
  7. public $autor;
  8. public $data;
  9. public $kategoria;
  10.  
  11. function __construct() 
  12. {
  13. }
  14.  
  15. }
  16.  
  17. class ObslugaNews extends News { 
  18.  
  19. public function dodajNewsa ($db) 
  20. {
  21. $sql = "INSERT INTO `news` (`id` ,`title` ,`text` ,`date` ,`edit_date` ,`id_author` ,`id_kategory`) VALUES ('','$this->tytul','$this->tresc','$this->data','','$this->autor','$this->kategoria')";
  22.  
  23. if (@!$db->query($sql)) echo " z tego!";
  24. }
  25.  
  26. public function edytujNewsa ($id,$db) 
  27. {
  28. $sql="UPDATE `news` SET `title`=$this->tytul ,`text`=$this->tresc ,`edit_date`='aktualna_data' ,`id_kategory`=$this->kategoria WHERE `news`.`id`=$id LIMIT 1";
  29.  
  30. if (@!$db->query($sql)) echo " z tego!";
  31. }
  32.  
  33. public function pobierzNewsa ($id,$db) 
  34. {
  35. $sql="SELECT `id` ,`title` ,`text` ,`date` ,`edit_date` ,`id_author` ,`id_kategor
    y` FROM `news` WHERE id='$id' LIMIT 1"
    ;
  36.  
  37. if (@!$wynik=$db->query($sql)) echo " z tego!";
  38. $wynik = $wynik->fetch_array();
  39.  
  40. return $wynik;
  41. }
  42.  
  43. public function ustawNewsa ($tytul,$tresc,$kategoria) 
  44. {
  45. $this->tytul = strip_tags(ltrim(addslashes($tytul)));
  46. $this->tresc = strip_tags(addslashes(ltrim($tresc)));
  47. $this->kategoria = strip_tags(ltrim(addslashes($kategoria)));
  48. }
  49. }
  50. ?>


Adriano.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Whisller
post
Post #2





Grupa: Zarejestrowani
Postów: 77
Pomógł: 5
Dołączył: 29.03.2006
Skąd: Poznań

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


@cysiaczek
Ja osobiscie nie wstawiał bym pobierania danych newsa w klasie reprezentujacej jego obiekt (News), bo i po co ma ona wiedziec jak i skad pobierac te dane?

Pozwolicie ze przedstawie swoja idee (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

  1. <?
  2.  
  3. /**
  4.  * Klasa reprezentujaca pojedynczy news
  5.  *
  6.  */
  7.  
  8. class News
  9. {
  10. /**
  11.  * W konstruktorze mozemy ustawic dane obiektu. Dla newsa to np. title, body, vi
    sibility etc.
  12. *
  13.  * @param array $args
  14.  */
  15. public function __construct(array $args)
  16. {
  17. isset($args['id'])  ? $this->setId($args['id'])  : '';
  18. isset($args['title'])$this->setTitle($args['title']) : '';
  19. isset($args['body'])  ? $this->setBody($args['body']) : '';
  20. isset($args['visibility']) ? $this->setVisibility($args['visibility']) : $this->setVisibility(false);
  21. }
  22.  
  23. /**
  24.  * @param int $id
  25.  */
  26. public function setId($id)
  27. {
  28. $this->id = (int)$id;
  29. }
  30.  
  31. /**
  32.  * @param string $title
  33.  */
  34. public function setTitle($title)
  35. {
  36. $this->title = $title;
  37. }
  38.  
  39. /**
  40.  * @param string $body
  41.  */
  42. public function setBody($body)
  43. {
  44. $this->body = $body;
  45. }
  46.  
  47. /**
  48.  * @param mixed $visibility
  49.  */
  50. public function setVisibility($visibility)
  51. {
  52. $this->visibility = (int)$visibility;
  53. }
  54.  
  55. private $id = null;
  56. private $title = null;
  57. private $body  = null;
  58. private $visibility = null;
  59. }
  60.  
  61. /**
  62.  * Klasa reprezentujaca managera newsow
  63.  *
  64.  */
  65. class NewsManager
  66. {
  67. /**
  68.  * W zaleznosci do tego czy przekazany zostaje ID newsa wykonujemy jego edycje l
    ub tez dodajemy nowy
  69.  *
  70.  * @param object $news Obiekt reprezentujacy pojedynczy news
  71.  */
  72. public function save(News $news)
  73. {
  74. if ( $news->getId() != null ) {
  75. $this->edit($news);
  76. } else {
  77. $this->add($news);
  78. }
  79. }
  80.  
  81. private function edit(News $news)
  82. {
  83. // Tutaj edycja
  84. }
  85.  
  86. private function add(News $news)
  87. {
  88. // Tutaj dodanie nowego
  89. }
  90.  
  91. private function delete($id)
  92. {
  93. // Usuniecie
  94. }
  95.  
  96. /**
  97.  * @param int $id ID newsa ktory chcemy pobrac
  98.  * @return object Obiekt klasy News
  99.  */
  100. public function getOne($id)
  101. {
  102. // Tutaj wyciagamy informacje na temat newsa, z pliku, bazy etc.
  103. // ...
  104.  
  105. $args = array();
  106. $args['id']  = $result['id'];
  107. $args['title'] = $result['title'];
  108. $args['body']  = $result['body'];
  109. $args['visibility'] = $result['visibility'];
  110.  
  111. return new News($args);
  112. }
  113.  
  114.  
  115. /**
  116.  * @return array Tablica obiektow klasy News
  117.  */
  118. public function getMany()
  119. {
  120. $result = array();
  121.  
  122. foreach( $news AS $oneNews ) {
  123. $args['id']  = $result['id'];
  124. $args['title'] = $result['title'];
  125. $args['body']  = $result['body'];
  126. $args['visibility'] = $result['visibility'];
  127.  
  128. $result[] = new News($args);
  129. }
  130.  
  131. return $result;
  132. }
  133. }
  134.  
  135.  
  136. // Wyciagniecie pojedynczego newsa 
  137. $newsManager = new NewsManager();
  138. $oneNews = $newsManager->getOne(4);
  139. // Teraz odwolujac sie do danych newsa robimy to przy uzyciu $oneNews->getTitle(), ->getBody(), ...
  140.  
  141.  
  142. // Wyciagniecie kilku newsow
  143. $newsmanager = new NewsManager();
  144. foreach( $newsManager->getMany() AS $oneNews ) {
  145. // Tutaj takze mozemy sie odwolywac jak do listingu powyzej tzn. $oneNews->getTitle(), ->getBody()... i bedziemy mieli dane newsa na ktorym w danej interacji operujemy.
  146. }
  147. ?>


To chyba tyle, wydaje mi sie ze nie jest to najgorsze rozwiazanie z kilku wzgledow.
1. Mozemy w latwy sposob robic kopie obiektow - przy np. porownywaniu obiektow przed i po edycji
2. Nie wazne skad pobierzemy dane w NewsManager'rze bo i tak operujemy na obiekcie
3. Nie jestesmy uzaleznieny od nazewnictwa w bazie danych poniewaz stosujemy getery wiec gdy nam sie zmienia nazwa w bazie np. z title na title_a ( a uwierzcie mi takie rzeczy sie zdarzaja (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) ) zmieniamy to tylko w managerze
Go to the top of the page
+Quote Post

Posty w temacie
- adriano321   Klasa news - czy to można nazwać OOP?   11.02.2008, 18:32:10
- - Cysiaczek   Nie zniechęcaj się, ale to jest kod strukturalny u...   11.02.2008, 20:43:31
- - Whisller   @cysiaczek Ja osobiscie nie wstawiał bym pobierani...   12.02.2008, 14:10:14
- - Cysiaczek   Twoje jest bardzie oop ;] Tylkp, że mi przyświecał...   12.02.2008, 15:45:18
- - adriano321   ooo właśnie o to mi chodziło. Dzięki wielkie za pr...   12.02.2008, 16:47:31
- - Whisller   @adriano321 Możesz przekazać handler po...   12.02.2008, 17:43:46
- - adriano321   No to teraz zaprezentuję całą klas...   14.02.2008, 18:24:19
- - Whisller   @adriano321 1. Nie rób echo w metodzie klasy Bo d...   14.02.2008, 21:31:34
- - revyag   A nie byłoby czytelniej zamiast tych wszystki setC...   15.02.2008, 09:50:24
- - adriano321   Cytat1. Nie rób echo w metodzie klasy smile.gif Bo...   15.02.2008, 14:33:05
- - Black-Berry   Tak czytam i widzę, że siedzimy w tym samym temaci...   16.02.2008, 01:24:31
- - Cysiaczek   Można też tak, co pozwala na zachowanie interfejsu...   16.02.2008, 08:30:05
- - adriano321   Czy to jest dobrze? Albo raczej czy to jest zgodne...   16.02.2008, 12:37:55
- - Whisller   @revyag Jasne że można ale tylko wtedy gdy masz pe...   17.02.2008, 23:11:52
- - revyag   @Whisller ale ja nie podałem __set tylko set__ To...   18.02.2008, 12:28:43
- - Cysiaczek   Może i odrobinę wolniejsze, ale jak masz mieć 100 ...   18.02.2008, 17:09:06
- - Sedziwoj   Jak dla mnie te wszystkie magiczne metody robią bu...   20.02.2008, 10:56:20


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

 



RSS Aktualny czas: 24.12.2025 - 08:54