Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przykładowa klasa artykułów a jej konstrukcja
Forum PHP.pl > Forum > PHP > Object-oriented programming
Barton
Witam,

Zaczynam przygodę z programowaniem obiektowym. Jako przewodnik służy mi książka 'PHP. Obiekty, wzorce, narzędzia' Matta Zandstry. Jednak nie mogę tam znaleźć jednoznacznej odpowiedzi na dość istotne pytanie.

Wyobraźmy sobie hipotetyczną podstronę która ma wyświetlać różne artykuły z bazy danych. I tutaj nasuwa się pytanie: w jaki sposób powinna być skonstruowana? Czy jedna klasa, odpowiadająca za artykuły powinna je wyświetlać, edytować, dodawać etc. na podstawie parametru $id? Np.:


  1. $artykuly->wyswietl($id);
  2. $artykuly->edytuj($id);



Czy może powinna istnieć osobna klasa reprezentująca jako taki artykuł. Mam tutaj na myśli sytuację w której z każdego pobranego artykułu tworzy się nowy obiekt:

  1. $artykul[2]->wyswietl();
  2. $artykul[2]->edytuj();
  3. $artykul[3]->usun();


I w tej sytuacji każdy artykuł jest osobnym obiektem.

Które rozwiązanie jest lepsze? Odpowiedź na to pytanie myślę że dość mocno rozjaśni mi ideę OOP. wink.gif Jeśli temat jest w nieodpowiednim dziale to proszę o przeniesienie do odpowiedniego.

Pozdrawiam.
viking
Pomyśl w tym przypadku o artykule jako pojedynczym wierszu z bazy danych na którym dokonujesz różnych operacji (czyli np setId, setAuthor, getPublishDate). Czyli rozwiązanie numer 2 i w przyszłości znacznie ułatwisz sobie pracę.
Fifi209
setId? Id ma być unikalne i jego nie zmieniamy, broń boże
mortus
Wyświetlanie i edycja to zadania dla zupełnie innej klasy, a w przypadku edycji nawet dla kilku klas, którym trzeba odpowiednie dane przekazać (chodzi o klasy widoku i formularza). Natomiast to co powinna realizować klasa artykułu to interakcja pomiędzy aplikacją a bazą danych - de facto jest to tzw. model danych, będący jednym z elementów wzorca MVC (model-widok-kontroler). Model ten, jak już wspomniałem powinien odpowiadać za interakcję/wymianę danych pomiędzy aplikacją a bazą danych, czyli:
  1. class Article {
  2. private $_db;
  3. public function __construct($db) {
  4. $this->_db = $db;
  5. }
  6. public function fetchAll() {
  7. $sql = "SELECT * FROM `articles`";
  8. $results = $this->_db->query($sql);
  9. $articles = array();
  10. while($row = $this->_db->fetchAssoc($results)) {
  11. $articles[] = $row;
  12. }
  13. return $articles;
  14. }
  15. public function find($article_id) {
  16. $sql = "SELECT * FROM `articles` WHERE `id` = {$article_id}";
  17. $results = $this->_db->query($sql);
  18. $article = $this->_db->fetchAssoc($results));
  19. return $article;
  20. }
  21. public function update($data) {
  22. // a tutaj aktualizacja danych, przy czym $data to tablica danych
  23. // zbudowana w oparciu o formularz
  24. }
  25. }

To tak w wielkim skrócie, bo powyższej klasie jeszcze bardzo wiele brakuje. Natomiast wyświetlanie powinno już odbywać się w innym miejscu, a to zależy od architektury aplikacji (we wzorcu MVC wyświetlanie odbywa się w widoku, przy czym kontroler przekazuje do niego odpowiednie dane). Niemniej wyglądałoby to tak:
  1. // wyświetlanie wszystkich artykułów
  2. $articleModel = new Article($db);
  3. $articles = $articleModel->fetchAll();
  4. foreach($articles as $article) {
  5. echo $article['title'];
  6. echo $article['content'];
  7. }
  8. // lub też jednego na podstawie id przekazanego w URL
  9. $articleModel = new Article($db);
  10. $article = $articleModel->find($_GET['id']);
  11. echo $article['title'];
  12. echo $article['content'];


EDIT:
Powyższa klasa i sposób jej wykorzystania to tylko przykłady, które w rzeczywistości wymagają jeszcze trochę (lub raczej dużo) pracy.
viking
Cytat(Fifi209 @ 18.04.2012, 18:33:40 ) *
setId? Id ma być unikalne i jego nie zmieniamy, broń boże


  1. SELECT id, title FROM articles


  1. foreach.... $article->setId($row->id)


W widoku wybranie z tego.
mortus
@viking: Jeśli już, to metoda powinna się nazywać raczej getId(), a nie setId() - get = pobierz, set = ustaw.
viking
Naprawdę? Chyba ustawiasz danymi z bazy (set) które pobierasz w widoku (get). Nazywa się to (polskie tłumaczenie sobie odpuszczę) domain object / model. Mówimy w swoich przykładach zastosowań o 2 różnych rzeczach. Ty zrobiłeś z tej klasy bezpośredni mapper. Ja mówię o takim podejściu http://martinfowler.com/eaaCatalog/dataMapper.html
http://stackoverflow.com/a/7109595
http://mwop.net/blog/202-Model-Infrastructure.html
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.