Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Przykładowa klasa artykułów a jej konstrukcja, Temat początkującego
Barton
post
Post #1





Grupa: Zarejestrowani
Postów: 70
Pomógł: 2
Dołączył: 26.10.2008

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


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.

Ten post edytował Barton 18.04.2012, 12:32:40
Go to the top of the page
+Quote Post
viking
post
Post #2





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


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ę.


--------------------
Go to the top of the page
+Quote Post
Fifi209
post
Post #3





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


setId? Id ma być unikalne i jego nie zmieniamy, broń boże


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
mortus
post
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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.

Ten post edytował mortus 18.04.2012, 18:10:33
Go to the top of the page
+Quote Post
viking
post
Post #5





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


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.


--------------------
Go to the top of the page
+Quote Post
mortus
post
Post #6





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


@viking: Jeśli już, to metoda powinna się nazywać raczej getId(), a nie setId() - get = pobierz, set = ustaw.
Go to the top of the page
+Quote Post
viking
post
Post #7





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


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

Ten post edytował viking 19.04.2012, 05:34:12


--------------------
Go to the top of the page
+Quote Post

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: 19.08.2025 - 15:47