Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z programowaniem obiektowym
Forum PHP.pl > Forum > PHP
michaloo
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]
marian8
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)
michaloo
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
scanner
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...
Seth
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.
michaloo
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 smile.gif
marian8
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...
michaloo
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?
hamlecik
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.
Cudi
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.
DeyV
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ć smile.gif
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.