Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: O OOP pytan kilka ...
Forum PHP.pl > Forum > Przedszkole
ppprn
Witam

Jako ze jestem poczatkujacy w sprawach programowania obiektowego mam pare pytan, na ktore chcialbym poznac odpowiedzi. Chyba dobrze trafilem;).
Na wstepie zaznacze, ze wszystko o co bede pytal dotyczy PHP4 nie PHP5.

Zaczynamy...

Przegladalem duzo skryptow opartych o OOP, troche sie naczytalem i troche mnie to wszystko teraz zastanawia. Glownym zalozeniem chyba jest poklasyfikowanie czynnosci jakie ma wykonac aplikacja, powiazanie ich miedzy soba itd. W wiekszosci widzialem poprostu wrzucone do jednego wora funkcje, zwracajace jakies tam wartosci, zupelnie bez ladu i skladu. Raczej nie o to w tym chodzi prawda? Zalozmy, ze chcemy stworzyc aplikacje do obslugi ksiegi gosci. Nie wiem czy dobrze rozumuje idee programowania obiektowego, ale mniej wiecej zrobilbym cos takiego:

  1. <?php
  2.  
  3. class Wpis {
  4. var $id;
  5. var $nick;
  6. var $ip;
  7. var $tresc;
  8.  
  9. function NowyWpisID($id){ }
  10. function NowyWpis($nick, $ip, $tresc){ }
  11. function UsunWpis(){ }
  12. function AktywujWpis(){ }
  13. function PobierzTresc(){ }
  14. }
  15.  
  16. class Ksiega extends Wpis {
  17. function PobierzIDsWpisow(){ }
  18. function PobierzIDsNieaktywnych(){ }
  19. }
  20.  
  21. ?>


itd. Zakldam, ze rozumuje poprawnie. Teraz pytanie: Metoda PobierzIDsWpisow pobierze mi z bazy danych IDs wszystkich wpisow. Lepiej, zeby zwracala ona wyniki tego zapytania czy pobierala zawartosc poszczegolnych wpisow przez NowyWpisID(pobrane_id), PobierzTresc() i zwracala je jako wynik. Zazwyczaj nie wiem, czy takie rzeczy powinny dziac sie wewnatrz metody, czy poza nia. Czyli np. metoda zwraca mi tablice z IDs, poza klasa pobieram zawartosci poszczegolnych wpisow przez NowyWpisID(id_z_tablicy), PobierzTresc.
Oczywiscie jesli cos jest nie tak na tym etapie to prosze o komentarz. Czego nie rozumiem i co moglbym poprawic (najlepiej z wyjasnieniem dlaczego etc.).
Jak Wy byscie rozwiazali stworzenie takiej klasy/klas? Jesli moge prosic o przyklady...?

Druga sprawa dotyczy klasy do obslugi bazy danych. Zalozmy ze mam prosta klase z paroma metodami do obslugi podstawowych operacji na bazie danych. Teoretycznie, za kazdym razem powinienem sie rozlaczyc z baza danych. Czy jest cos w stylu "destruktora", by nie musiec za kazdym razem po stworzeniu nowego obiektu ($objSmth=new Smth()winksmiley.jpg rozlaczac sie recznie przez np. $objSmth->db->Close(); ?

Powrocmy do klasy Wpis. Zalozmy, ze chce by dzialala ona w oparciu o klase do obslugi bazy danych. Deklarujemy, ze klasa Baza_danych jest klasa nadrzedna i teraz pytanie o konstruktor klasy Wpis. Teoretycznie powinienem pobierac w nim takie rzeczy jak: host, nazwa uzytkownika, haslo, nazwa bazy danych?
Jest to troche uciazliwe. Zawsze musze pobierac w konstruktorze klasy, parametry niezbedne do odpalenia klasy rodzica? Jak wygladaloby utworzenie klasy Wpisz na podstawie klasy Bazy danych a nastepnie klasy Ksiega na podstawie klasy Wpis? Konkretnie chodzi mi o konstruktory i przekazywanie danych miedzy klasami. Wewnatrz konstruktora tworze nowy obiekt klasy do obslugi bazy danych. Jak odwolywac sie do metod tej klasy? Np. $this->Zapytanie("..."); czy np. $this->db->Zapytanie("...") ? Czyli np. trzowrzyc dodatkowa zmienna wewnatrz klasy, ktora przechowuje "uchwyt" do obiektu klasu bazy danych? W dalszym ciagu bede musial rozlaczac sie recznie np. przez wywolanie $objSmth->db->Close() ?;/

Kolejna rzecz dotyczy nazewnictwa metod wewnatrz klasy. Nazwy te moga sie powtarzac. Jak wiec najlepiej nazywac metody klasy? Moze jakis przedrostek zawierajacy nazwe klasy a pozniej np. nazwe metody? (Wiem, ze mozna odwolac sie do metod poszczegolnych klas, nawet gdy ich nazwy sa identyczne).
Np. $objSmth->SmthQuery(); albo $objDb->DbQuery().

Sprawdzanie poprawnosci danych, np. wpisanego adresu email to zadanie metody danej klasy (i zwracanie true lub false w przypadku wystapienia bledu), czy mechanizmu wywolujacego ta metode poza obiektem?

Zalozmy, ze korzystam z systemu szablonow Smarty. Przekazywanie danych do szablonu to kwestia osobnego mechanizmu (skrypt pobiera wszystkie dane potrzebne do wyswietlenia strony, obrabia je tworzy nowy obiekt i wyswietla strone), czy wszystkie obiekty musza byc ze soba powiazane, w tym rowniez z obiektem Smarty.

Sory, ze troche tego duzo wyszlo i tak chaotycznie napisanego, ale mam nadzieje, ze ktos pomoze mi zrozumiec OOP. Jak pisalem wyzej, troche sie juz naogladalem, ale ludzi robia sobie worki na funkcje z klas a mi nie o to chodzi. Wyszlo tez troche pytan o klase do obslugi bazy danych bo wiekszosc przykladow jakie widzialem nie byla o taka oparta a jedynie miala zywcem wpisane polecenia obslugi mysql'a.

Pozdrawiam i licze na pomoc. Jak sobie cos przypome to dopisze.
Vengeance
2. Destruktory są tylko w php5. Prawda jest taka, że php sam kończy połączenia

3. Poczytaj o Singletonie

4. Takie same nazwy metod nic nie powodują smile.gif Zawsze widać, z jakiej to klasy metoda pochodzi. Mam ład smile.gif
M4chu
Nie wiem czy jest sens robienia klasy Wpis, bo czym bedzie $Wpis po wywolaniu metody $Wpis->usun()? smile.gif Ja bym poprostu zrobil klase KsiegiGosci i tam metody dodaj, edytuj, usun, pobierzWgId - zwraca wpis w postaci tablicy np array( 'id' => 1, 'tresc' => 'tresc' )itp.
Nie widze sensu dziedziczenia po klase bazy danych - uzyj jej instancji w klasie ksiegi i po sprawie.
Btw nie widze problemu z tym rozlaczaniem - na poczatku skryptu tworzysz instancje klasy bazy, laczysz sie z nia, a na koncu rozlaczasz, w czym problem?
Co do sprawdzenia poprawnosci to jak chcesz, jak to bedzie cos popularnego np walidacja emaila to nie ma sensu powielac w kazdej klasie, trzymaj metody walidujace w jednym pliku i w razie potrzeby go zalaczaj.
Co do szablonow... ja to robie tak, w konstruktorze tworze sobie instancje klasy szablonu, w metodzie (np pobierzWgId) pobieram dane i poprostu przekazuje je do szablonu.
@Vengeance: w php4 mozna bylo symulowac winksmiley.jpg
lezaru
szukam pomocy z php e-mail lezalak@gazeta.pl
Nievinny
@M4chu - a jaki sens jest symulować destruktory w php4? To strasznie spowalnia czas wykonania...
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.