Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa news - czy to można nazwać OOP?
Forum PHP.pl > Forum > PHP > Object-oriented programming
adriano321
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.
Cysiaczek
Nie zniechęcaj się, ale to jest kod strukturalny ujęty w klasy (pseudo oop). Nie jest to nic złego, ale aby nie psuć pojęcia OOP, to nazywajmy to poop snitch.gif

Błędy, które od razu rzucają się w oczy.

1. Nazewnictwo klas i metod. Pisz angielskie wersje
2. W tym wypadku News jest jedną tabelą, więc dobrze, aby był tak traktowany (to sie nazywa mapowanie relacyjno obiektowe - tu w podstawowej wersji na jednej tabeli). Częśc metod, jak np. obsługaNews:: pobierzNewsa($id) może być w samej klasie News. Ni eoznacz to bynajmniej, że ta klasa obsługaNews jest zbędna.

  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($data)
  12. {
  13. // Wykorzystamy to, że php ma dynamiczne typowanie zmiennych
  14. if(is_integer($data))
  15. {
  16. $sql="SELECT * FROM news WHERE id='$id' LIMIT 1";
  17. $result=$db->query($sql);
  18. $current=$result->fetchRowAsArray();
  19. }
  20. elseif(is_array($data))
  21. {
  22. $current=& $data;
  23. }
  24.  
  25. //Tu już Twoja wyorraźnia niech zadziała, bo da się to zrobić ładniej, ale ja nie 
    chce zaciemniać kodu
  26. $this->id=$current['id'];
  27. //itd.
  28. }
  29.  
  30. public function save()
  31. {
  32. // zapisa obiektu do bazy danych
  33. }
  34.  
  35. }
  36.  
  37. class NewsBase
  38. {
  39. private $collection;
  40.  
  41. public function __construct()
  42. {
  43. $this->collection=new NewsCollection(); // Obiekt kolekcji
  44. }
  45.  
  46. public function loadSomeNews($howMany, $order)
  47. {
  48. $stack=array();
  49. $sql="SELECT * FROM news WHERE ORDER BY $order LIMIT $howMany";
  50. $result=$db->query($sql);
  51. foreach($result->fetch_array() as $row)
  52. {
  53. $obj=new News($row);
  54. $stack[]=$obj;
  55. $this->collection->add($obj);
  56. }
  57. return $stack;
  58. }
  59.  
  60. public function findById($id)
  61. {
  62. if($this->collection->has($id))
  63. {
  64. return $this->collection->get($id);
  65. }
  66. else
  67. {
  68. $obj=new News($id);
  69. $this->collection->add($obj);
  70. return $obj;
  71. }
  72. }
  73.  
  74. function saveCollection()
  75. {
  76. foreach($this->collection as $obj)
  77. {
  78. $obj->save();
  79. }
  80. }
  81. }
  82. ?>


Pisane z palca, bez sprawdzenia, traktuj to jako pseudokod smile.gif

Pozdrawiam.

p.s To nie jest jedyna metoda, anie też nie zawsze najlepsze. Jest za to szybka w implementacji i daje dość duże pole manewru.
Whisller
@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 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 tongue.gif ) zmieniamy to tylko w managerze
Cysiaczek
Twoje jest bardzie oop ;]
Tylkp, że mi przyświecała inna idea. Chodziło o pokazanie, do czego przydaje się klasa NewsManager/NewsBase etc.
adriano321
ooo właśnie o to mi chodziło. Dzięki wielkie za przykłady tongue.gif

To raczej niewiele ma wspólnego z OOP, ale jak pozbyć się $db (odwołania do bazy danych) w liście parametrów metody?
  1. <?php
  2. public function pobierzNewsa ($id,$db)  // <- to $db
  3. {
  4. $sql="SELECT `id` ,`title` ,`text` ,`date` ,`edit_date` ,`id_author` ,`id_kategor
    y` FROM `news` WHERE id='$id' LIMIT 1"
    ;
  5.  
  6. if (!$wynik=$db->query($sql)) echo " z tego!";
  7. $wynik = $wynik->fetch_array();
  8.  
  9. return $wynik;
  10. }
  11. ?>


Robiąc podobnie jak Cysiaczek bez $db:

  1. <?php
  2. public function loadSomeNews($howMany, $order)
  3. {
  4. $stack=array();
  5. $sql="SELECT * FROM news WHERE ORDER BY $order LIMIT $howMany";
  6.  [b]  $result=$db->query($sql); [/b]  // <- Chodzi mi o to
  7. foreach($result->fetch_array() as $row)
  8. {
  9. $obj=new News($row);
  10. $stack[]=$obj;
  11. $this->collection->add($obj);
  12. }
  13. return $stack;
  14. }
  15. ?>


wywala mi błąd:
Kod
Fatal error: Call to a member function query() on a non-object in


w linijce:
Kod
  if (!$wynik=$db->query($sql))  echo " z tego!";


Czy da się to jakoś obejść?
Whisller
@adriano321
Możesz przekazać handler połączenia w konstruktorze
  1. <?php
  2. public function __construct($dbh) 
  3. {
  4. $this->dbh = $dbh;
  5. }
  6. ?>


I wtedy odwołujesz się w metodzie poprzez $this->dbh np. $this->dbh->query(), $this->dbh->fetch() etc.
Albo też możesz użyć singletona ( http://www.phppatterns.com/docs/design/singleton_pattern ) lub rejestru( http://www.phppatterns.com/docs/design/the_registry ).
adriano321
No to teraz zaprezentuję całą klasę news(na podstawie klasy Whisllera, dzięki chłopaki), może komuś się w przyszłości przyda tongue.gif . Jakby ktoś miał jakieś zastrzeżenia to proszę o przedstawienie ich, będą one na pewno bardzo pomocne w dalszej pracy.

  1. <?php
  2. class News
  3. {
  4. private $id = null;
  5. private $title = null;
  6. private $text = null;
  7. private $date = null;
  8. private $editDate = null;
  9. private $idAuthor = null;
  10. private $idKategory = null;
  11.  
  12.  
  13.  
  14. public function __construct(array $args)
  15. {
  16. isset($args['id'])  ? $this->setId($args['id'])  : '';
  17. isset($args['title'])$this->setTitle($args['title'])  : '';
  18. isset($args['text'])  ? $this->setText($args['text'])  : '';
  19. isset($args['date'])  ? $this->setDate($args['date'])  : '';
  20. isset($args['editDate'])  ? $this->setEditDate($args['editDate'])  : '';
  21. isset($args['idAuthor'])  ? $this->setIdAuthor($args['idAuthor'])  : '';
  22. isset($args['idKategory']) ? $this->setIdKategory($args['idKategory']) : '';
  23. }
  24.  
  25. public function setId($id)
  26. {
  27. $this->id = (int)$id;
  28. }
  29.  
  30. public function setTitle($title)
  31. {
  32. $this->title = $title;
  33. }
  34.  
  35.  
  36. public function setText($text)
  37. {
  38. $this->text = $text;
  39. }
  40.  
  41. public function setDate($date)
  42. {
  43. $this->date = $date;
  44. }
  45.  
  46. public function setEditDate($editDate)
  47. {
  48. $this->editDate = $editDate;
  49. }
  50.  
  51. public function setIdAuthor($idAuthor)
  52. {
  53. $this->idAuthor = (int)$idAuthor;
  54. }
  55.  
  56. public function setIdKategory($idKategory)
  57. {
  58. $this->idKategory = $idKategory;
  59. }
  60.  
  61. public function getId() 
  62. {
  63. return $this->id;
  64. }
  65.  
  66. public function getTitle() 
  67. {
  68. return $this->title;
  69. }
  70.  
  71. public function getText() 
  72. {
  73. return $this->text;
  74. }
  75.  
  76. public function getDate() 
  77. {
  78. return $this->date;
  79. }
  80.  
  81. public function getEditDate() 
  82. {
  83. return $this->editDate;
  84. }
  85.  
  86. public function getIdAuthor() 
  87. {
  88. return $this->idAuthor;
  89. }
  90.  
  91. public function getIdKategory() 
  92. {
  93. return $this->idKategory;
  94. }
  95.  
  96. }
  97.  
  98.  
  99. class NewsManager
  100. {
  101. public $db;
  102.  
  103. function __construct($db) {
  104. $this->db=$db;
  105. } 
  106.  
  107. public function save(News $news)
  108. {
  109. if ($this->getId($news->getId())) {
  110. $this->edit($news);
  111. } else {
  112. $this->add($news);
  113. }
  114. }
  115.  
  116. private function getId($id) 
  117. {
  118. $sql="SELECT id FROM news WHERE id='$id'";
  119. $result = $this->db->query($sql);
  120.  
  121. if ($result->num_rows == 1) {
  122. return true;
  123. } else {
  124. return false;
  125. }
  126. }
  127.  
  128. private function edit(News $news)
  129. {
  130. $sql="UPDATE `news` SET `title`='".$news->getTitle()."' ,`text`='".$news->getText()."' ,`editDate`='".$news->getEditDate()."' ,`idKategory`='".$news->getIdKategory()."' WHERE `news`.`id`='".$news->getId()."' LIMIT 1";
  131.  
  132. if ($this->db->query($sql)) echo "tak";
  133. else echo $this->db->error;
  134. }
  135.  
  136. private function add(News $news)
  137. {
  138. $sql = "INSERT INTO `news` VALUES ('','".$news->getTitle()."','".$news->getText()."','".$news->getDate()."','','".$news->getIdAuthor()."','".$news->getIDKategory()."')";
  139.  
  140. if ($this->db->query($sql)) echo "tak";
  141. else echo $this->db->error;
  142. }
  143.  
  144. private function delete($id)
  145. {
  146. $sql="DELETE FROM `news` WHERE `news`.`id`=$id LIMIT 1";
  147. if ($this->db->query($sql)) echo "tak";
  148. else echo $this->db->error;
  149. }
  150.  
  151. public function getOne($id)
  152. {
  153.  
  154.  
  155. $sql="SELECT * FROM `news` WHERE `id`=$id LIMIT 1";
  156.  
  157. $result = $this->db->query($sql);
  158. $result = $result->fetch_array();
  159.  
  160. $args = array();
  161.  
  162. $args['id'] =  $result['id'];
  163. $args['title']  =  $result['title'];
  164. $args['text'] =  $result['text'];
  165. $args['date'] =  $result['date'];
  166.  $args['editDate'] =  $result['editDate'];
  167. $args['idAuthor'] =  $result['idAuthor'];
  168. $args['idKategory']=  $result['idKategory'];
  169.  
  170. return new News($args);
  171. }
  172.  
  173. public function getMany($howMany,$startFrom)
  174. {
  175. $sql="SELECT * FROM `news` WHERE `news`.`id`=$id ORDER BY id DESC LIMIT $startFro
    m, $howMany"
    ;
  176.  
  177. $result = $this->db->query($sql);
  178.  
  179. $news = array();
  180.  
  181. while( $temp = $result->fetch_array() ) {
  182. $args = array();
  183.  
  184. $args['id'] =  $temp['id'];
  185. $args['title']  =  $temp['title'];
  186. $args['text'] =  $temp['text'];
  187. $args['date'] =  $temp['date'];
  188. $args['editDate'] =  $temp['editDate'];
  189. $args['idAuthor'] =  $temp['idAuthor'];
  190. $args['idKategory']=  $temp['idKategory'];
  191.  
  192.  
  193. $news[]=new News($args);
  194.  
  195. }
  196. return $news;
  197. }
  198.  
  199. public function getNewsList($sort) // ASC or DESC
  200. {
  201. $sql = "SELECT `id`,`title` FROM `news` ORDER BY id ".$sort;
  202. $result = $this->db->query($sql);
  203. $temp = array();
  204. while ($abc = $result->fetch_array()) 
  205. {
  206. $temp[]=array('id' => $abc['id'], 'title' => $abc['title']);
  207. }
  208.  
  209. return $temp;
  210. }
  211. }
  212. ?>


Adrian.
Whisller
@adriano321
1. Nie rób echo w metodzie klasy smile.gif Bo dajmy na to będziesz chciał komunikat o błędzy zapisać do pliku albo też wysłać mailem, co wtedy? Zwracaj go w postaci stringa albo też wyrzucaj wyjątek.
2. W metodzie getOne nie musisz wartości przypisywać to tablicy $args jeśli nazwy pól w bazie danych są takie same jak indeksy w tablicy argumentów przyjmowanej przez konstruktor klasy News.
Tzn. możesz sobie skrócić pracę pisząc
$r = mysql_fetch_assoc($sth);
return new News( $r );
3. Zamiast robić metodę getNewsList można by pokusić się o to aby klasa NewsManager dziedziczyła po jakiejś klasie - lub też otrzymywała obiekt klasy - w której określał byś jakie pola chcesz pobrać oraz kryteria do WHERE, tak mi się wydaje.
A chesz zostawić tą metodę tak jak jest to daj albo sprawdzanie czy zmienna $sort jest ustawiona na DESC albo ASC lub też daj wartość domyślną dla tego argumentu( public function getNewsList($sort='ASC') ).
revyag
A nie byłoby czytelniej zamiast tych wszystki setCosTam i getCosTam, zrobić tak?
  1. <?php
  2. public function set__($var,$val) {
  3. $this->{$var} = $val;
  4. }
  5. public function get__($var) {
  6. return $this->{$var}
  7. }
  8. ?>

a potem np.
  1. <?php
  2. isset($args['id']) ? $this->set__('id',$args['id']) : '';
  3. ?>


zamiast n metod dla n właściwości są 2.
adriano321
Cytat
1. Nie rób echo w metodzie klasy smile.gif Bo dajmy na to będziesz chciał komunikat o błędzy zapisać do pliku albo też wysłać mailem, co wtedy? Zwracaj go w postaci stringa albo też wyrzucaj wyjątek.
2. W metodzie getOne nie musisz wartości przypisywać to tablicy $args jeśli nazwy pól w bazie danych są takie same jak indeksy w tablicy argumentów przyjmowanej przez konstruktor klasy News.
Tzn. możesz sobie skrócić pracę pisząc
$r = mysql_fetch_assoc($sth);
return new News( $r );
3. Zamiast robić metodę getNewsList można by pokusić się o to aby klasa NewsManager dziedziczyła po jakiejś klasie - lub też otrzymywała obiekt klasy - w której określał byś jakie pola chcesz pobrać oraz kryteria do WHERE, tak mi się wydaje.
A chesz zostawić tą metodę tak jak jest to daj albo sprawdzanie czy zmienna $sort jest ustawiona na DESC albo ASC lub też daj wartość domyślną dla tego argumentu( public function getNewsList($sort='ASC') ).


1. To jest na razie wersja robocza, zapomniałem usunąć echa, mam zamiar wyrzucać wyjątki ale to dopiero później dopiszę.
2. Też tak na początku myślałem ale po $db->fetch_array() otrzymywałem tablicę:

Kod
Array ( [0] => 8 [id] => 8 [1] => CSM [title] => CSM [2] => CSM [text] => CSM [3] => 2012-01-01 05:01:20 [date] => 2012-01-01 05:01:20 [4] => 2042-01-01 06:01:20 [editDate] => 2042-01-01 06:01:20 [5] => 231 [idAuthor] => 231 [6] => 2 [idKategory] => 2 )


// yyy nie no rzeczywiście przecież to nie mało by żadnego znaczenia tongue.gif hehe dobra to już wiem co i jak.

@revyag - dobra uwaga biggrin.gif
Black-Berry
Tak czytam i widzę, że siedzimy w tym samym temacie. Przeczytaj mój wątek na temat klasy db_driver i jak 'singleton' rozwiązuje sprawę, z przekazywaniem obiektu $db:

http://forum.php.pl/widocznosc_obiektu_wew...asy_t87343.html
Cysiaczek
Można też tak, co pozwala na zachowanie interfejsu smile.gif
  1. <?php
  2. function lcfirst($str)
  3. {
  4. return strtolower(substr($str, 0, 1)) . substr($str, 1);
  5. }
  6.  
  7. class callHelper
  8. {
  9. protected $data;
  10.  
  11. public function __call($method, $args)
  12. {
  13.  
  14. if(!method_exists($this, $method))
  15. {
  16. $pre=substr($method, 0, 3);
  17. $post=substr($method, 3);
  18. $propertyName=lcfirst($post);
  19.  
  20. if($this->has($propertyName))
  21. {
  22. if($pre=='set')
  23. {
  24. return $this->setProperty($propertyName, $args[0]);
  25. }
  26. if($pre=='get')
  27. {
  28. return $this->getProperty($propertyName);
  29. }
  30. }
  31. else
  32. {
  33. throw new Exception('Niezdefiniowana metoda '.__CLASS__.'::'.$method);
  34. }
  35. }
  36.  
  37. return call_user_func_array(
  38. array($this, $method),
  39. $args
  40. );
  41. }
  42.  
  43. public function setProperty($key, $value)
  44. {
  45. $this->data[$key]=$value;
  46. }
  47.  
  48. public function getProperty($key)
  49. {
  50. return $this->data[$key];
  51. }
  52.  
  53. public function has($key)
  54. {
  55. if(isset($this->data[$key]))
  56. {
  57. return true;
  58. }
  59. return false;
  60. }
  61. }
  62. ?>
adriano321
Czy to jest dobrze? Albo raczej czy to jest zgodne ze wzorcem Singleton?

  1. <?php
  2. class Database extends mysqli 
  3. {
  4.  
  5. private static $oInstance = false; 
  6.  
  7. private function __construct() 
  8. {
  9. } 
  10.  
  11. public static function getinstance($dbHost, $dbUser, $dbPass, $dbBaseName) 
  12. { 
  13. if ( self::$oInstance == false ) 
  14. { 
  15. self::$oInstance = new mysqli($dbHost, $dbUser, $dbPass, $dbBaseName);
  16. } 
  17. return self::$oInstance; 
  18. } 
  19. }
  20.  
  21. $db = Database::getinstance('aaa','aaa','aaa','aaa');
  22. ?>
Whisller
@revyag
Jasne że można ale tylko wtedy gdy masz pewność że nie będziesz przeprowadzał w setach jakiś walidacji/filtracji etc. choćby rzutowania. Co wtedy? Nie zrobisz w __set switch z wyłapywaniem nazw pól i odpaleniem odpowiedniego rzutowania winksmiley.jpg
--
Edit
Ok mozna by napisac metody dla wartosci przy ustawioniu ktorych przeprowadzamy walidacje etc ale jakos osobiscie przyzwyczailem sie do takiego sposobu pisania + z tego co slyszalem ( nie przeprowadzalem wlasnych testow ) metody magiczne typu __set __get __call etc. sa wolniejsze.
revyag
@Whisller ale ja nie podałem __set tylko set__ smile.gif To mała ale zasadnicza różnica. I to wszystko o czym mówisz da się zrobić. np. jako trzeci parametr podawać typ parametru.
__set wykorzystałbym do czegoś innego.
Cysiaczek
Może i odrobinę wolniejsze, ale jak masz mieć 100 setterów i getterów, to lepiej chyba magiczne dać snitch.gif Ja tam je polubiłem - zwłaszcza __call, którego implementację dawałem i która jest bardzo uniwersalna.
Sedziwoj
Jak dla mnie te wszystkie magiczne metody robią burdel w kodzie i tyle.
Chociaż tak prosta rzecz jak podpowiadanie nie będzie w tedy działać i nikt mi nie powie że to będzie upierdliwe. Moim zdaniem klasa powinna mieć jawny interfejs a nie jakieś sztuczki. (w sumie to brak typizacji argumentów [co pociąga brak możliwości definicji metod o tej samej nazwie a różnych argumentach] w PHP też mnie irytuje)

A nie wiem mi się nie zdarzyło abym w jednej klasie musiał pisać 100 metod get i set...
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.