Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> O OOP pytan kilka ..., Pytania mlodego OOPowca
ppprn
post 3.03.2005, 23:16:56
Post #1





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 4.02.2005

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


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.

Ten post edytował ppprn 3.03.2005, 23:21:56
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Vengeance
post 3.03.2005, 23:42:03
Post #2





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


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


--------------------
Go to the top of the page
+Quote Post
M4chu
post 3.03.2005, 23:59:29
Post #3





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 28.09.2003
Skąd: Rzeszów

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


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

Ten post edytował M4chu 4.03.2005, 00:00:11
Go to the top of the page
+Quote Post
lezaru
post 19.04.2005, 09:22:13
Post #4





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 12.03.2005

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


szukam pomocy z php e-mail lezalak@gazeta.pl
Go to the top of the page
+Quote Post
Nievinny
post 19.04.2005, 14:01:53
Post #5





Grupa: Zarejestrowani
Postów: 134
Pomógł: 0
Dołączył: 27.01.2005
Skąd: Białystok

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


@M4chu - a jaki sens jest symulować destruktory w php4? To strasznie spowalnia czas wykonania...


--------------------
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 Wersja Lo-Fi Aktualny czas: 14.08.2025 - 02:46