Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z programowaniem obiektowym
michaloo
post
Post #1





Grupa: Zarejestrowani
Postów: 48
Pomógł: 0
Dołączył: 15.05.2003
Skąd: Bielsko-Biała

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


Witam
Mam problem. Chciałem napisać serwis www w OO i już nawet zacząłem ale teraz, po dwóch dniach bez pisania, stwierdziłem, że to co wypociłem ma niewiele wspolnego z programowaniem obiektowym. Bo chociaż w klasach są metody, które wykonują różne operacje na bazie, sam nie wiem czemu, stworzyłem pozatym osobne funkcje. (klasy mam takie jak tabele w bazie ale do tych klas napisałem osobne funkcje, które tworzą nowe obiekty i "obsługują" metody).

Przeglądałem ezpublish ale jest on dla mnie za bardzo skomplikowany. Również w mojej "biblii" (książce php i mysql) php nie ma zastosowania klas w wiekszych projektach stron dynamicznych. Szukałem jakiś prostych przykładów w sieci ale nic wartego uwagi nie znalazłem. Może wy macie jakieś swoje próbki czy też inne tego typu bajerki?Byłbym bardzo wdzięczny gdybyście pomogli mi (przedstawiając jakis przykład czy też wyjaśnając) zrozumieć zasady programowania zorientowanego obiektowo.

Pozdrawiam - michaloo[/code]
Go to the top of the page
+Quote Post
marian8
post
Post #2





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 3.12.2003
Skąd: Jelenia Góra

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


moim zdaniem programowanie obiektowe ma potezna przewage. Moze w php tego od razu tak nie widac ale wyobraz sobie : masz baze klientow i kazdy klient ma okreslony dostep do jakichs danych... obiektowo robisz to $this->prawo_dostepu() a nie obiektowo robisz prawo_dostepu($user) gdzie $user znajduje sie gdzies tam...
Ja nie wobrazam sobie wiekszego projektu bez obiektow. Jak sie dobrze pozna obiekty to jest to potezne narzedzie ulatwiajace bardzo prace.
Prostego przykladu chyba nie znajdziesz bo obiekty sa wykorzystywane do wiekszych projektow.
Nie wiem jak uargumentowac wyzszosc programowania obiektowego nad zwyklym. Radze uwierzyc na slowo. Ja mimo ze ledwo liznalem programowanie obiektowe to juz teraz nie wyobrazam sobie wiekszego projektu bez obiektow (szczegolnie przy bazach danych)
Go to the top of the page
+Quote Post
michaloo
post
Post #3





Grupa: Zarejestrowani
Postów: 48
Pomógł: 0
Dołączył: 15.05.2003
Skąd: Bielsko-Biała

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


nie mam watpliwosci w kestii uzycia czy nieuzycia obiektow. Uwazam ze moja wiedza na temat klas jest odpowiednia ale nawet po analizie jakis opensource'ow nie jestem w stanie wyobrazic sobie struktury takiego systemu dlatego prosilem o jakis proste przyklady bardziej zlozonych aplikacji czy moze jakies porady typu - kazda tabela powinna miec swoja klase ale co powinno sie w takiej klasie znalezc? i jak pozniej tworzyc nowe obiekty i wywolywac metody? oto pytania ktore mnie nurtuja ... a pozniej (wmiare zaglebiania sie w temat) pojawia sie nowe na ktore, mam nadzieje znalezc odpowiedz
Go to the top of the page
+Quote Post
scanner
post
Post #4





Grupa: Zarząd
Postów: 3 503
Pomógł: 28
Dołączył: 17.10.2002
Skąd: Wrocław




Nie rozumiem dlaczego łączysz logicznie tabele (te z bazy danych?) z obiektami.
Obiektem może być np. news a jego właściwosciami: tytuł, treść, ID, autor... ilość komentarzy i tablica obiektów typu komentarz.
metodami zaś: zapisz, usuń, modyfikuj, szukaj...
Go to the top of the page
+Quote Post
Seth
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 2 335
Pomógł: 6
Dołączył: 7.03.2002

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


Polecam poczytac o Object Oriented Desgin i Object Modeling w net'cie:
tutaj jest kilka ciekawych linkow:
http://www.well.com/user/ritchie/oo.html
http://www.sei.cmu.edu/str/descriptions/oodesign.html
http://www.accu.org/acornsig/public/articl.../ood_intro.html

Byc moze niedlugo jak powstanie juz tymczasowy portal bedzie mozna poczytac o tym na przykladach php.
Go to the top of the page
+Quote Post
michaloo
post
Post #6





Grupa: Zarejestrowani
Postów: 48
Pomógł: 0
Dołączył: 15.05.2003
Skąd: Bielsko-Biała

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


Cytat
Nie rozumiem dlaczego łączysz logicznie tabele (te z bazy danych?) z obiektami.
Obiektem może być np. news a jego właściwosciami: tytuł, treść, ID, autor... ilość komentarzy i tablica obiektów typu komentarz.
metodami zaś: zapisz, usuń, modyfikuj, szukaj...

aha! Kiedyś tak gdzieś przeczytałem, że klasy powinny odpowiedać tabelom w bazie ale może ( i na to wygląda) cos mi sie pomieszało....

dzięki za linki Seth...juz czytam (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
marian8
post
Post #7





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 3.12.2003
Skąd: Jelenia Góra

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


Kiedyś napisałem coś takiego - może się przyda...

[php:1:d3c26984b1]<?php
class mojaBaza {

var $sql;

function mojaBaza($baza, $serwer="localhost", $uzytkownik="root", $haslo="") {
$this->sql = mysql_connect ($serwer,$uzytkownik,$haslo);
mysql_select_db($baza);
}

function rozlacz() {
mysql_close($this->sql);
}

function dane_dodaj($tabela) {
$iloscArg = func_num_args();
$zapytanie = "INSERT INTO ".$tabela." VALUES(";
for ($i=1; $i<$iloscArg; $i++) {
$zapytanie .= "'".func_get_arg($i)."'";
if ($i<$iloscArg-1) {
$zapytanie .= ", ";
} else {
$zapytanie .= ")";
}
}
// echo $zapytanie;
if (mysql_query($zapytanie)) {
return 1;
} else {
return 0;
}
// echo mysql_error();
}

function dane_usun($tabela,$warunek) {
$zapytanie = "DELETE FROM ".$tabela." WHERE ".$warunek;
if (mysql_query($zapytanie)) {
return 1;
} else {
return 0;
}
}

function dane_aktualizuj($tabela,$warunek) {
$zapytanie = "SELECT * FROM ".$tabela;
if (!$rezultat = mysql_query($zapytanie)) {
return 0;
}
$iloscPol = mysql_num_fields($rezultat);
$iloscArg = func_num_args();
if ($iloscArg-2 == $iloscPol) {
$zapytanie = "UPDATE ".$tabela." SET ";
for ($i=2; $i<$iloscArg; $i++) {
$zapytanie .= mysql_field_name($rezultat,$i-2)."='".func_get_arg($i)."'";
if ($i<$iloscArg-1) {
$zapytanie .= ",";
}
}
$zapytanie .= " WHERE ".$warunek;
if (mysql_query($zapytanie)) {
return 1;
} else {
return 0;
}
} else {
return 0;
}
}

function ilosc_rekordow($tabela,$warunek="") {
if ($warunek=="") {
$where = "";
} else {
$where = " WHERE ".$warunek;
}
$zapytanie = "SELECT * FROM ".$tabela.$where;
$rezultat = mysql_query($zapytanie);
return mysql_num_rows($rezultat);
}

function zapytanie($zapytanie) {
if ($rezultat = mysql_query($zapytanie)) {
return $rezultat;
} else {
return 0;
}
}

}


/* PRZYKŁAD
$baza = new mojaBaza("test");
$baza->dane_dodaj("tab1","przykład","zastosowania","obiektow");
$baza->rozlacz();
*/
?>[/php:1:d3c26984b1]
Może nie wykorzystuje tutaj żadnego polimorfizmu albo innych ciekawostek obiektowych ale parę razy mi się to przydało...
Go to the top of the page
+Quote Post
michaloo
post
Post #8





Grupa: Zarejestrowani
Postów: 48
Pomógł: 0
Dołączył: 15.05.2003
Skąd: Bielsko-Biała

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


witam
niedokladnie o to mi chodzilo ale po przeczytaniu przykladu mariana8 nasunelo mi sie pytanie z tym deklarowaniem zmiennych. Pokaze na przykladzie. Mam plik klasy.php a w nim (kod napisany "na szybko" i napewno ma mase bledow ale narazie nie jest to specialnie wazne):
[php:1:ced0a56767]<?php
class uzytkownik
{
var $id_uzytkownika;
var $pseudonim;
var $imie;
var $email;
var $ranga;
var $recenzje;
var $zapowiedzi;
var $pliki;
var $posty;
var $zdjecia;
var $strona_www;
var $gg;
var $icq;
var $adres;
var $zainteresowania;
var $status;
var $data_ostatniej_wizyty;
var $data_rejestracji;

function wyciagnanie_z_bazy($element, $wartosc)
{
$zapytanie = "SELECT * FROM 'uzytkownicy' WHERE $element = $wartosc";
$dzialanie = @mysql_query($zapytanie);
if(!$dzialanie)
return 0;
$wynik = $dzialaj->fetchRow(DB_FETCHMODE_ASSOC);
if($wynik > 0)
{
$this->id_uzytkownika = $wynik['id_uzytkownika'];
$this->pseudonim = $wynik['pseudonim'];
$this->imie = $wynik['imie'];
$this->email = $wynik['email'];
$this->ranga = $wynik['ranga'];
$this->recenzje = $wynik['recenzje'];
$this->zapowiedzi = $wynik['zapowiedzi'];
$this->pliki = $wynik['pliki'];
$this->posty = $wynik['posty'];
$this->zdjecia = $wynik['zdjecia'];
$this->strona_www = $wynik['strona_www'];
$this->gg = $wynik['gg'];
$this->icq = $wynik['icq'];
$this->adres = $wynik['adres'];
$this->zainteresowania = $wynik['zainteresowania'];
$this->status = $wynik['status'];
$this->data_ostatniej_wizyty = $wynik['data_ostatniej_wizyty'];
$this->data_rejestracji = $wynik['data_rejestracji'];
return 1;
}
else
return blad;
}

function logowanie($pseudonim, $haslo);
{
$zapytanie = "SELECT * FROM 'uzytkownicy' WHERE pseudonim = $pseudonim AND haslo = password($haslo)";
$dzialanie = @mysql_query($zapytanie);
if(!$dzialanie)
return 0;
$wynik = $dzialaj->fetchRow(DB_FETCHMODE_ASSOC);
if($wynik > 0)
{
$this->id_uzytkownika = $wynik['id_uzytkownika'];
$this->pseudonim = $wynik['pseudonim'];
$this->imie = $wynik['imie'];
$this->email = $wynik['email'];
$this->ranga = $wynik['ranga'];
$this->recenzje = $wynik['recenzje'];
$this->zapowiedzi = $wynik['zapowiedzi'];
$this->pliki = $wynik['pliki'];
$this->posty = $wynik['posty'];
$this->zdjecia = $wynik['zdjecia'];
$this->strona_www = $wynik['strona_www'];
$this->gg = $wynik['gg'];
$this->icq = $wynik['icq'];
$this->adres = $wynik['adres'];
$this->zainteresowania = $wynik['zainteresowania'];
$this->status = $wynik['status'];
$this->data_ostatniej_wizyty = $wynik['data_ostatniej_wizyty'];
$this->data_rejestracji = $wynik['data_rejestracji'];
return sukces;
}
else
return 0;
}

function rejestracja($pseudonim, $haslo, $imie, $email, $strona_www, $gg, $icq, $adres, $zaintersowania)
{
$zapytanie = "INSER INTO 'uzytkownicy' VALUES $pseudonim, $haslo, $imie, $email, '0', '0', '0', '0', '0', '0', $strona_www, $gg, $icq, $adres, $zaintersowania, '0', date(d-m-Y), date(d-m-Y)";
$dzialanie = @mysql_query($zapytanie);
if(!$dzialanie)
return 0;
else
return 1;
}

function zmiana_danych($id_uzytkownika, $pseudonim, $haslo, $imie, $email, $strona_www, $gg, $icq, $adres, $zaintersowania)
{
$zapytanie = "UPTADE ($pseudonim, $haslo, $imie, $email, $strona_www, $gg, $icq, $adres, $zaintersowania) FROM 'uzytkownicy' VALUES $pseudonim, $haslo, $imie, $email, $strona_www, $gg, $icq, $adres, $zaintersowania WHERE id_uzytkownika = $id_uzytkownika";
$dzialanie = @mysql_query($zapytanie);
if(!$dzialanie)
return 0;
else
return 1;
}

function usun_uzytkownika($id_uzytkownika)
{
$zapytanie = "DELETE FROM 'uzytkownicy' WHERE id_uzytkownika = $id_uzytkownika LIMIT 1";
$dzialanie = @mysql_query($zapytanie);
if(!$dzialanie)
return 0;
else
return 1;
}


function pokaz_zmienna($zmienna)
return $this->$zmienna;
}
?>[/php:1:ced0a56767]

i mam pytanie czy to deklarowanie (?) var .... ma w tym przypadku sens?
i jeszcze jedna sprawa czy zrobic osobny plik uzytkownicy.php gdzie bedzie wykorzystywana ta klasa?
oraz ostatnie pytanie - czy elementy strony(naglowek, tabele, stopka) tez powinny miec swoja wlasna klase np. class strona ktora mialaby metody odpowiedzialne za wyswietlanie odpowiednich czesci strony np function naglowek($tytul).....blabla; czy dobrze mysle?
Go to the top of the page
+Quote Post
hamlecik
post
Post #9





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 31.07.2003

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


Cytat
witam

oraz ostatnie pytanie - czy elementy strony(naglowek, tabele, stopka) tez powinny miec swoja wlasna klase np. class strona ktora mialaby metody odpowiedzialne za wyswietlanie odpowiednich czesci strony np function naglowek($tytul).....blabla; czy dobrze mysle?



Pamietaj ze klasy sie tworzy z mysla o operacjach na danych a nie przechowywaniu ich w niej. Lepiej bedzie jak zrobisz klase, ktora bedzie przekazywac dane do odpowiedniego szablonu i tam je wyswietlala.
Go to the top of the page
+Quote Post
Cudi
post
Post #10


Administrator planeta/IRC


Grupa: Przyjaciele php.pl
Postów: 385
Pomógł: 0
Dołączył: 19.04.2003
Skąd: Zabrze

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


Jeśli już robiłbym w ten sposób do zamiast tych wszystkich zmiennych zadeklarował bym jedną tablice i w niej trzymał dane. Dopisałbym kilka metod do jej łatwiej obsługi i wypełniania i byłoby ok.
Go to the top of the page
+Quote Post
DeyV
post
Post #11





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




Nauki OOP w php warto rozpocząć od przestudiowania jakiegoś mechanizmu opartego na oo. Uważam, że dobym początkiem może być zapoznanie się z wsumie niezbyt złozoną ale bardzo ciekawą budową http://www.students.cs.uu.nl/people/voostind/eclipse/
Autor, mimo że nie napisał raczej niczego odkrywczego, pokazuje, jak korzystać z dzidziczenia, jak odwoływać sie do obiektów itp.

Co do obiektów danych - to osobny rozdział pisania obiektowego. Takie spojrzenie na pisanie ma wiele zalet, znacznie ułatwia pobieranie danych i zabezpiecza kod. Ale... Ale wywodzi się z języków klientSide, a więc opierających sie na zupełnie inych założeniach.
Oczywiście pojawiło się wiele implementacji takiego 'spojrzenia na świat' również w php (np. obiektowo zorientawana warstwy do obsługi bazy danych z PEAR) Ostatnio dowiedziałem sie że rónież znazny i ceniony TUTOS jest tak włąsnie pisany. Czyli dla każdego pobieranego rekordu z bazy tworzony jest obiekt. I jakoś to działa...

Mnie jednak nie przekonuje - zresztą temat ten pojawił sie ostatnio w topicu na forum PRO który pokazuje, że raczej nie jest to rozwiązanie optymalne dla php (jak tu napisać jakiegoś JOINa...)

Oczywiście nie zmniejsza to potencjału obiektowości w php. Trzeba ją tylko umieć dobrze wykorzystać (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 22:32