Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Programowanie obiektowe...
Forum PHP.pl > Forum > Przedszkole
primo
Witam,

wszędzie człowiek napotyka się na to hasło: programowanie obiektowe, no i aby być w temacie, trzeba było coś w tym kierunku robić. W tym celu przeczytałem artykuł zamieszczony na łamach php.pl Wprawdzie dowiedziałem się tam podstaw, ale nie rozumiem wielu rzeczy. Dla mnie najlepszym narzędziem do nauki jest sam przykład programowania tradycyjnego i przerobienie go na obiektowe.
W poniżej zamieszczonym skrypcie (nie działającym zresztą) spróbowałem przerobić to, co mam już zrobione, na sposób obiektowy zgodnie ze wskazówkami z różnych książek.

  1. <?php
  2. require_once('funkcje_bazy.php');
  3.  
  4. $lacz = lacz_bd();
  5. if (!$lacz)
  6. return 'Poł&plusmn;czenie z serwerem bazy danych niemożliwe - proszę spróbować póĽniej.';
  7.  
  8. class media
  9. {
  10.  
  11. var $tytul_pl;
  12.  
  13. function wyswietl_tytuly_filmow($tytul_pl)
  14. {
  15.  
  16. $sql = &#092;"SELECT * FROM filmy ORDER BY id\";
  17.  
  18.  
  19. while ( $row = mysql_fetch_row($r) )
  20. {
  21. $tytul_pl = $row[1];
  22.  
  23.  
  24.  
  25.  print &#092;"$this->tytul_pl.\";
  26.  
  27. }
  28.  
  29. }
  30.  
  31.  
  32. $obj1= new media();
  33. $obj1->wyswietl_tytuly_filmow($tytul_pl);
  34. ?>



proszę o wyjaśnienie następującego zagadnienia:

w momencie jak w metodzie wyswietl_tytuly_filmow pobiore dane z bazy danych to w OO należy je również potraktować pętlą czy też stosuje się do tego inne narzędzia questionmark.gif i czy to w ogole ma sens questionmark.gif nie mogę zrozumieć tego co robi się z tymi danymi "po drodze" od utworzenia clasy do jej zastosowania (znaczy się wyświetlenia wyników).

a tak nawiasem mówiąc to zwróciło mi następujące błędy: unexpected T_VARIABLE, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}'


proszę o jakieś wskazówki niekoniecznie usunięcia błędów lecz o tym co po drodze powinno się robić z takimi danymi...

pozdrawiam
bela
  1. <?php
  2. require_once('funkcje_bazy.php');
  3.  
  4. $lacz = lacz_bd();
  5. if (!$lacz) {
  6. return 'Poł&plusmn;czenie z serwerem bazy danych niemożliwe - proszę spróbować póĽniej.';
  7. }
  8.  
  9. class media
  10. {
  11. var $tytul_pl;
  12.  
  13. function wyswietl_tytuly_filmow($tytul_pl)
  14. {
  15. $sql = &#092;"SELECT * FROM filmy ORDER BY id\";
  16. while ( $row = mysql_fetch_row($r) )
  17. {
  18. $tytul_pl = $row[1];
  19. print &#092;"$this->tytul_pl.\";
  20.  }
  21.  
  22. }
  23. }
  24.  
  25. $obj1= new media();
  26. $obj1->wyswietl_tytuly_filmow($tytul_pl);
  27. ?>


miałeś nie zamkniętą klamre
proponuję trzymać klasy w osobnym pliku
zmień nazwy zmiennych tak trochę trudno zrozumieć o co chodzi jak ma się 3 takie same zmienne, które robią co innego dry.gif
DeyV
1. niestety - twój przykład ma bardzo niewiele wspólnego z OOp . (dosłowniej mówiąc - łączy z nim go tylko słowo class) jesli znajdę chwilę czasu - napiszę swoją propozycję takiej klasy

2.
  1. <?php
  2.  
  3.  $this->tytul_pl = $row[1];
  4. echo $this->tytul_pl ;
  5.  
  6. ?>
primo
no prawdę mówiąc takiej odpowiedzi się spodziewałem. Czytając dziś pół dnia to co mi się dostało w ręce odnośnie OOp wiele razy przy pierwszych próbach "zabawy" kończyło się to skwitowaniem, że ninijszy skrypt nie ma nic wspólnego z programowaniem obiektowym. Z deko mi jest to ciężko pojąć, bo pomimo, iż używam mechanizmów stosowanych w OOp to jednak nie tworzę skryptu opartego o OOp. Trochę to zagmatwane.

Z niecierpliwością oczękuję "obiecanej klasy". Proszę tylko o umieszczenie jej w zaczętym już właśnie tym temacie, aby mi przypadkiem gdzieś nie umknęła.


zapmniałbym: w sumie to myślałem że ta zmienna (która występuje w 3 postaciach wg bela_666) to to samo. Nie jest tak questionmark.gif

pozdrawiam
bela
$this->pl odnosi sie do var $pl, ale $pl nie odnosi sie do var $pl

primo, tutaj chodzi o myślenie obiektowe, a nie o sposób zapisu winksmiley.jpg
primo
właśnie tego nie mogę przezwyciężyć i pojąć
scanner
No to na początek trochę teorii. (Polecam "Thinking in Java")
  • Wszystko jest obiektem. Ty, klawiatura, drzewo za oknem.
  • Klasa jest to zbiór właściwości i metod opisujących określoną grupę obiektów.
  • Właściwość jest to zmierzalna wartośc opisująca elementraną cechę obiektu. (np. Kolor włosa - jednego)
  • Metoda jest to opisane w klase działanie jakie może "wykonać" ten obiekt. np. Włos może urosnąć. Może wypaść. Ale już nie może się sam obciąć. Obciąć włosy może obiekt Fryzjer działając obiektem Nożyczki na właściwość tablicową Włosy obiektu Głowa należacego do zestawu właściwości obiektu Klient.
  • Mówimy, że "Zmienna jest typu...." oraz "Obiekt jest klasy...". Tak jak zmienna jest tylko jednego typu ( np. int ) tak obiekt jest tylko jednej klasy.(np. Obiekt klasy Długopis)
To na wstęp.
Ty powinieneś zaprojektować obiekt klasy Film oraz obiekt klasy Lista filmów.

Klasa Film opisuje właściwości:
- ID
- Tytuł
- Rok produkcji
- Reżyser (przy czym Reżyser to powinien być osobny obiekt klasy Osoba)
- Wypozyczający (obiekt klasy Osoba)
oraz metody:
- zapiszDane() zapisajaca jednym insertem jeden rekord w bazie
- czytajDane() która powinna odczytać dane jednego filmu na podstawie np. ID
- aktualizuj() - jeden UPDATE jednego ściśle okreslonego (np. przez ID) filmu
- usuń() - jeden DELETE na rekordzie jak wyżej
- wypożycz() - ustawia znacznik wypozyczenia na True, ID wypozyczajacego, date wypozyczenia. Wywoluje metodę metodę wypozyczyl() obiektu Wypozyczajacy, ktora dodaje film do archiwum wypozyczonych tytulow.
- zwróc() - ustawia znacznik wypozyczenia na false, itp...


Klasa ListaFilmów ma głownie właściwosć
- Lista (ktora jest tablicą)
oraz metody w stylu
- Czytaj_listę
- usuń() (dla okreslonych filmow wywoluje ich metodę Usuń() i kasuje (unset()) ichistnienie z tablicy.
- ....

Prawdopodobnie niedlugo pokaze kod pewnego skryptu, ktory staralem sie napsiac obiektowo (dla php4) - na pewno bedzie wiele poprawek i ktos bardziej doswiadczony w OOD/OOP mi wytnie wiele niescislosci, ale moze sie to okazac niezla szkołka praktyczna dla poczatkujacych smile.gif
primo
wielkie dzięki za tak obszerny wykład, co nieco rozjaśniło to moje wątpliwości. Jednakże mam jeszcze jedno pytanko: mianowicie konstruując klasę Film i nadając jej właściwości typu: id, tytuł polski, tytuł oryginalny, rok produkcji, czas trwania, rodzaj nośnika na jakim go mam (vhs lub dvd), gatunek, rezenzja oraz 2 dotyczące określonych osób: reżysera i aktorów występujących - dlaczego to powinien być osobny obiekt klasy osoba questionmark.gif Czy to dodatkowo nie komplikuje skryptu, bo i tak wszystko mam zapisane w jednej tabeli questionmark.gif

pozdrawiam
scanner
No i już wyniknął problem źle zaprojektowanej bazy.

Trzymasz w bazie tabele:
Osoba (ID, Imię, Nazwisko);
Klient (ID, IDOsoba);
Rezyser (ID, IDOsoba)
Aktor( ID, IDOsoba)
Film( ID, Tytul, ...., IDKlient (jesli wypozyczony), IDRezyser, IDAktor (tu moze byc serializowana tablica zapisywana do pola TEXT) )

Dlaczego Rezyser i Wyporzyczajacy powinni byc jako osobne obiekty klasy Osoba? Bo:
  1. <?php
  2. $Osoba->ListaWypozyczonych->IDFilmu->zwroc()
  3. ?>

oraz
  1. <?php
  2. $Rezyser->ListaFilmow->PobierzListeWedlug( IDRezyser, $Rezyser->ID );
  3. ?>


Jedyną wadą OOD/OOP jest to, ze autor skryptu musi mieć bardzo rozwinięte myślenie abstrakcyjne, a sam proces projektowania zajmuje nieco czasu. Jednak jeśłi dobzre napiszesz klasy, to operacje na obiektach to już pryszcz.
primo
ale powiedz mi, czy Ty mi to tłumaczysz pod kątem przygotowania aplikacji obługującej wypożyczalnie kaset i płyt dvd, czy też przerobienia strony www i na obiekty i dostosowania bazy questionmark.gif Mnie interesuje póki co ta druga forma. I w związku z tym nie wiem jaki jest sens tworzenia w bazie takich tabel jak:
Osoba (ID, Imię, Nazwisko);
Klient (ID, IDOsoba);
Rezyser (ID, IDOsoba)
Aktor( ID, IDOsoba)

Nie wiem, może właśnie nie myślę na tyle abstrakcyjnie, aby te tabele umieścić w projekcie questionmark.gif Tak jak wspomniałem w jednym z poprzednich postów teraz mam następującą strukturę: id, tytul_pl, tytul_ang, rezyseria, dlugosc, rok_prod, aktorzy (moze byc kilku), recenzja, gatunek, nosnik_dvd i nosnik_vhs (ustawione na tak lub nie w zaleznosci od tego czy mam czy nie). Wszystkie te pola tworzą jedną tabelę. Jest w tym przypadku sens tworzenia tabeli filmy: idFilmu, tytul_pl, tytul_ang, czas_trwania oraz tabeli aktorzy: aktorzy, idFilmu itd. questionmark.gif oraz dodatkowo tabeli rezyser questionmark.gif co mi to da questionmark.gif

pozdrawiam
scanner
Ja tłumacze na dowolnym przykładzie, w którym, moge przekazać Tobie treść tłumaczenia na zywym przykładzie.
Zresztą nie rozmawiamy tutaj o strukturze Twojej bazy, tylko o OOD/OOP.

Powtórze jeszcze raz. Idealnie zaprojektowana aplikacja zakłada, ze wszystko jest obiektem. Takie myslenie jest wbudowane w podstawę logiki np. Javy, gdzie nawet INT to obiekt.

Co do bazy. Co da oddzielenie np. osob do osobnej tabeli?
Ano to:
- masz mniej danych.
- łączysz film z osoba poprzez (int) ID, a działania na intach są najszybsze.
- możesz rozbudowac informacje o osobie ponad imię i nazwisko.
- zmiana nazwiska z "Jan Kowalski" na "Jan Nowak" polkega na zmienie jednego rekordu w bazie a nie wszystkich rekordow, gdzie pisze "Kowalski"

Uff smile.gif
Już to komuś tłumaczyłem kiedyś na forum. Poszukaj na forum "słownikowanie" - chyba się jeszcze post zachował.
primo
ok od tej pory w tym temacie tylko i wyłącznie OOP. Powiedz mi tylko jedno, czy taki podział i rozdrobnienie bazy to jeszcze baza relacyjna czy już obiektowa albo hybrydowa questionmark.gif


czekam na obiecane skrypty od Szanownych przedmóców.

pozdrawiam
hawk
Baza danych? Relacyjna, jak najbardziej relacyjna. Widziałeś kiedyś obiektową bazę danych? Np O2. Kosmos. Używałeś kiedyś OQL? Nijak nie przypomina SQL.

Hybrydowe bazy są już nieco bardziej strawne. Np. taki Oracle z wszystkimi swoimi obiektami. Ale tak naprawdę nie za bardzo to jest obiektowe.

Obiektowymi bazami danych to ja bym sobie na razie nie zawracał głowy. A normalizacja bazy danych to element teorii relacyjnych baz danych. Bo obiektowych w ogóle nie trzeba będzie normalizować winksmiley.jpg
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.