Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Własny mini wzór projektowy
Forum PHP.pl > Forum > PHP > Object-oriented programming
MateuszS
Witam.
Ostatnio postanowiłem wgłębić się w tematykę OOP. Trochę już umiem, może i tyle, żeby spróbować coś napisać większego, typu księga gości (o ile to można nazwać czymś większym ;P).
Mam kilka pytań.

1. Jak rozmieszczać pliki na serwerze? W jakich folderach? Tak sobie obmyśliłem żeby było mniej więcej tak:
/public_html/index.php
/public_html/naglowek.php
/public_html/stopka.php
itd.
/public_html/class/class.mysql.php
/public_html/class/class.ksiega.php
ew. itd.

W plikach w katalogu głównym bym wywoływał w bloku try { } obiekty.

2. I tu właśnie. Czy wszystkie metody w klasie, mające new Exception (wyjątek) mają być definiowane w bloku try { }? Jeżeli tak to praktycznie cała strona będzie w bloku try bo wszędzie się może zdarzyć np. puste pole, taki nick istnieje, i inne wyjątki.

3. Nie chcę również obsługiwać różnych baz danych. Tylko MySQL. Aż takiej uniwersalności skryptu nie chcę. Z jednego powodu - nie umiem czegoś takiego napisać a w polskim internecie niestety nie ma dobrych materiałów na ten temat. Nauczę się z czasem.

4. Od razu pragnę zaznaczyć że nie interesują mnie CHWILOWO gotowe wzory projektowe z internetu, które już ktoś zrobił, do których trzeba się koniecznie stosować. Ta strona jest na mój własny użytek i nie ma potrzeby żeby była tak jak ktoś sobie napisał, że ma być. Mam nadzieję że wiecie o co chodzi.

Jeżeli macie jakieś dodatkowe rady to z chęcią wysłucham. Pozdrawiam i dziękuję.
jmail
1. Jak sobie rozmieścisz to Twoje. Ważne żebyś to ogranął i patrząc na to nie myślał jak filozof patrzący w nocnik: "To przechodzi ludzkie pojęcie biggrin.gif"
2. Nie przesadzaj z try catch może czasami lepiej switchem albo ifem coś sprawdzić? snitch.gif
3. Zapraszam na PW - pokażę Ci jak to napisać winksmiley.jpg
4. No tak trzymać

Rady? Rób tak, żebyś Ty był zadowolony. A później tak, żeby interpreter była zadowolony (wydajność). A jak komuś coś się nie będzie podobać to mów to już było biggrin.gif Im szybciej wykształcisz włąsne (oczywiście tylko dobre tongue.gif) nawyki tym lepiej. Ważne żebyś trzymał się cały czas jednej konwencji i nie skakał z kwiatka na kwiatek tongue.gif
wookieb
1) Zależy co trzymasz w tych plikach
2) Nie musisz ( http://pl2.php.net/manual/pl/function.set-...ion-handler.php ) ale możesz smile.gif
3) Użyj PDO, najbardziej uniwersalne narzędzie zachowujące przy tym prawie identyczną prędkość wykonywania niż biblioteki wyspecjalizowane w obsłudze danego silnika baz danych
4) MVC jest najpopularniejszy i możliwe, że najbardziej słuszny wzorzec. Problem polega na tym jak go zaimplementujesz. Prawie każdy ma inny sposób, lepszy, gorszy a czasem nawet tragiczny. Wszystko zalezy od ciebie i co chcesz z nim dokładniej zrobić.
MateuszS
Ok dzieki wam, ale moze zarzuccie jakimis konkretami np do punktu 2. Bo nie bardzo wiem jak np w body.php (gdzie jest tresc strony) wyswietlac newsy. W bloku try? Wywolywac obiekty? Probowalem tak, dziala tylko czy to jest aby dobre rozwiazanie.
cojack
Chyba mylimy pojęcia, chcesz includować jakieś stopki sropki do pliku index.php?

po 1, to jest mało praktyczne, includować to Ty sobie możesz templatke do maili
po 2, jak już OOP to OOP a nie chgw co.
po 3, w pliku index wywołaj dispatcher, który będzie Ci ładował odpowiednie moduły z księgi gości, u mnie na blogu masz opisane ładnie
po 4, zainwestuj 2 dni w nauke smartów.

Cytat
3) Użyj PDO, najbardziej uniwersalne narzędzie zachowujące przy tym prawie identyczną prędkość wykonywania niż biblioteki wyspecjalizowane w obsłudze danego silnika baz danych


gdybym miał drukarkę, wydrukowałbym sobie to i zamieścił w galerii "niedouki".


  1. set_exception_handler()
bezsens.

Cytat
4) MVC jest najpopularniejszy i możliwe, że najbardziej słuszny wzorzec. Problem polega na tym jak go zaimplementujesz. Prawie każdy ma inny sposób, lepszy, gorszy a czasem nawet tragiczny. Wszystko zalezy od ciebie i co chcesz z nim dokładniej zrobić.


n/c

Problem w implementacji MVC jest taki, że go nie ma! MVC - model vidok controler, w modelu trzymasz metody w ktorych masz kod sql, w widoku trzymasz metody parsujące templatke, a w controlerze sprawdzasz dane jakie dostałeś z akcji, i dokonujesz wyboru co zrobić, czy zapytać bazę i wyświetlić coś z bazy, czy walnąć mu brakiem dostępu itp.

No sztuka, oj sztuka, co najmniej doktorata trzeba pisać z tego by to ogarnąć.
wookieb
Cytat(cojack @ 16.10.2009, 23:17:48 ) *
gdybym miał drukarkę, wydrukowałbym sobie to i zamieścił w galerii "niedouki".

Udowodnij albo sprawdź.


Cytat
bezsens.
To synonim słowa "cojack" smile.gif
Co widzisz w tym złego chłopcze?
MateuszS
Chyba troche zboczylismy z tematu. Jak juz mowilem, nie interesuja mnie rzeczy typu MVC, ktorych nie rozumiem.. jeszcze. Rozumiem ze za pomoca smartow moge np wyswietlic wpisy. Nawet jezeli mam w klasie petle while w ktorej wyswietlam newsy pobierane z bazy? Jak to do HTMLa przeniesc?
Zyx
cojack -> zgadzam się, że w teorii wzorzec wygląda prościutko, ale w praktyce popatrz sobie na popularne frameworki, co w nich ludzie implementują i sprzedają pod nazwą "MVC"... jak widać, prostota wzorca niespecjalnie przekłada się na jego zrozumienie nawet u doświadczonych programistów.

MateuszScirka -> mimo iż PDO obsługuje sporo baz danych*, warto z niego korzystać chociażby dlatego, że jest obiektowy i dużo lepiej napisany, niż natywne rozszerzenia, a przy stosowaniu podpinania danych właściwie całkowicie odporny na SQL Injection. Ponadto jest to jedyne rozszerzenie, które faktycznie ma obsługę błędów, a nie jakieś pseudointeligentne funkcje w stylu mysql_error() i ostrzeżenia, które mówią wszystko, tylko nie to, co potrzeba i wywalają się wszędzie, tylko nie tam, gdzie powinny.

Ponadto jeśli już chcesz iść w systemy szablonów, to Smarty (TEN Smarty, a nie "te" Smarty - nauczcież się wreszcie ludzie to poprawnie odmieniać...) akurat jest jednym z gorszych wyborów: przestarzały, źle napisany, powolny, prezentujący złe i nieeleganckie podejście do problemu. Jest co najmniej kilka znacznie lepszych projektów, jeden z nich znajdziesz w mojej stopce.

* - co nie znaczy, że samo jego użycie gwarantuje poprawne działanie wszystkich systemów bazodanowych.
MateuszS
Widze nie da sie napisac strony w obiektowym bez uzycia jakis "wtyczek" itp? Prosze czytac moj 1szy post do konca. Nie chce NIC pobierac, zadnych .php z pomocniczymi skryptami, ani SMARTA ani Open Power Template 2 ani nic innego dopuki nie naucze sie pisac bez tego. Po prostu musze sie nauczyc mieszac kod html z obiektowym php bo w klasie przeciez nie napisze tabelii calej a potem nie wywolam w okreslonym miejscu strony... chociaz... tiredsmiley.gif
Zyx
Da się napisać bez gotowych skryptów, tylko masz wtedy dużo więcej pisania. Przy większych projektach nikt tak nie robi, gdyż się nie opłaca pisać wszystkiego od zera za każdym razem, gdy siadasz do nowego zadania. Pamiętaj też, że "wzorzec projektowy" a "gotowy skrypt" to zasadnicza różnica. O ile te drugie w celach edukacyjnych możesz pominąć, to pierwszych - nie, gdyż to są właśnie sprawdzone sposoby rozwiązania typowych problemów, jakie można spotkać. Natrafiasz na problem i patrzysz, że dany wzorzec pozwala Ci go rozwiązać, podpowiadając Ci, jak powinieneś zorganizować klasy, jak powinny wyglądać zależności między nimi i co one Ci dają. Zamiast pytać się na forum o to samo i dostawać taką samą odpowiedź, masz ładnie skatalogowany opis problemu i sposób jego rozwiązania, przez co się dodatkowo uczysz, analizując takie przypadki. I tu dochodzimy do jednej z takich praktyk: nie powinno się mieszać kodu PHP odpowiedzialnego za przetwarzanie danych z kodem HTML, co oznacza, że w Twoich klasach nie powinno być ani bajta kodu HTML. Sposób wyświetlania danych powinieneś zapisać w czymś oddzielnym, najczęściej jest to oddzielny plik zwany szablonem, który można napisać w PHP (i tu już możesz mieszać HTML z PHP, i to niekoniecznie obiektowym), albo w innym języku, teoretycznie lepiej dostosowanym do tego zadania.

Natomiast PDO powinieneś mimo wszystko użyć z kilku powodów:

1. Jest wbudowane w PHP, nie musisz nic instalować itd.
2. Z bazą danych i tak musisz się łączyć i komunikować. Bez przesady, żaden trzeźwo myślący programista nie będzie tego implementować samodzielnie, tylko użyje któregoś z gotowych rozszerzeń: albo opakuje stare funkcje w obiektówkę, albo skorzysta właśnie z PDO. Opakowywanie własnoręczne to masochizm, zwłaszcza gdy - jak sam piszesz - jest to dla Ciebie jeszcze nowość. Wyjdzie Ci coś, co z obiektówką ma tylko tyle wspólnego, że wokół function cośtam() są klamerki i słowo kluczowe class...
3. Nie nauczysz się dobrze programować obiektowo, a przynajmniej zajmie Ci to dużo więcej czasu, jeśli nie będziesz choć trochę korzystać z gotowego obiektowego kodu, który będzie lepiej napisany i pokaże Ci, jak dana rzecz powinna wyglądać.
4. Ucz się dobrych, porządnych praktyk od samego początku, jak już chcesz się uczyć.
MateuszS
Ok, ale zalozmy mam takie cos. Mam tabele w bazie id,nick,text. Nic nadzwyczajnego. W klasie robie
  1. while($wynik=mysql_fetch_assoc($query)) { // tu jakos musze je wszystkie wyswietlic $wynik['id'],$wynik['nick'] itd albo zwrocic za pomoca return


i chce to umiescic w odpowiedniej tabeli/divie, zmienic czcionke itd. Czy za pomoca wzorca to zrobie? No pewnie tak, ale mozecie podac przyklad uzycia? tak aby byla w tym petla while?
Zyx
Oczywiście. Oto pseudokod pobierający dane:

  1. $tpl = new Template('szablon.php');
  2.  
  3. $stmt = $pdo->query('SELECT ... FROM ...');
  4. $items = array();
  5. while($row = $stmt->fetch())
  6. {
  7. $items[] = $row;
  8. }
  9. $stmt->closeCursor();
  10.  
  11. $tpl->items = $items;
  12. $tpl->display();


A oto przykładowy szablon (szablon.php):

  1. <?php if(!empty($items)){ ?>
  2. <table>
  3. <?php foreach($items as $item){ ?>
  4. <tr>
  5. <td><?php echo $item['title']; ?></td>
  6. <td><?php echo $item['foo']; ?></td>
  7. </tr>
  8. <?php } ?>
  9. </table>
  10. <?php } ?>


Jak widzisz, NIE wyświetlam danych od razu przy ich pobieraniu, ale dysponuję specjalnym obiektem klasy Template, do którego mogę wrzucać zmienne do wyświetlenia. W momencie wywołania display() obiekt załaduje szablon, wstawi do niego wszystkie dane i go wyświetli. W ten sposób masz oddzieloną logikę skryptu (pobieranie danych, ich obróbka) od procesu wyświetlania.
MateuszS
Aha bo myslalem ze while trzeba umiescic w klasie zeby nie mieszac strukturalnego z obiektowym
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.