[ kelja @ 21.06.2008. 14:02 ] @
Elem,
znam da naslov nije u skladu sa temom i da krsim pravila ovog ozbiljnog foruma, ali malo razbibrige nije na odmet.
Ovako,
nesto mi je doslo ovog leta (cari dokolice:)) da se ozbiljno i konacno uhvatim u kostac sa OOP!(Pa kud puklo da puklo!)

E sad, najbolji nacin da 'savladam gradivo' bio bi, prirodno, pokusaj pravljenja neke klasice. Medjutim, tu imam problem...

Svi primeri za vezbu koji su mi pali na pamet, jednostavno uopste i ne demonstriraju prednost OO pristupa, i imam utisak da bih te i slicne probleme jednako kvalitetno resio i obicnim funkcijama...
Recimo, krenuo sam sa pravljenjem klase za validaciju forme i uvideo da mnogo brze i bolje posao odradi set funkcija.

Juce sam kao napravio neku login klasu i dosao do istog zakljucka...

Dakle, moje je pitanje, sta mi vi, iskusni magovi OOP-a preporucujete, koji PHP problem (a da nije preterano slozen) je zgodan za resavanje putem klasa, odnosno na cemu vezbati.

Hvala unapred!
[ Nemanja Avramović @ 21.06.2008. 14:24 ] @
Kako ne vidiš prednosti OOPa? Jesi proučio pojmove "enkapsulacija", "nasleđivanje" i "polimorfizam"?

Kod jednostavnijih poslova jeste jednostavnije koristiti funkcije, ali kod komplikovanijih stvari OOP je obavezan. A i sama činjenica da objekat jedne klase drži sve podatke i metode (funkcije) vezane za istu unutar sebe meni mnogo odgovara i lakše se tako snalazim...

Recimo imaš sistem za fakultet gde imaš studente, profesore i ostalo osoblje fakulteta. Napraviš klasu "osoba" koja sadrži zajedničke elemente (ime, prezime, jmbg, itd...) a onda iz nje samo izvodiš klase za studente (dodaš broj indeksa, smer, godinu, itd...), profesore (šta predaje, kad je zaposlen, ....) i za ostalo osoblje (tu ubaciš ostale podatke koji su potrebni ).

Mislim, ovo je školski primer nasleđivanja ali valjda ilustruje malo prednosti OOPa.

[Ovu poruku je menjao Nemanja Avramović dana 21.06.2008. u 17:44 GMT+1]
[ jablan @ 21.06.2008. 14:59 ] @
Keljo, uzmi sors nekog dobro napisanog MVC frejmvorka i čitaj. Mada bih ti ja savetovao da iskoristiš svoju volju da učiš i naučiš Rubi i Rejls, skapiraćeš koncepte koje ćeš posle moći da koristiš i u PHP-u, ako ikad budeš poželeo da se vratiš... ;)
[ kelja @ 21.06.2008. 16:48 ] @
He he he, @jablane ti konstantno podrivas ugled php-a, i to na php forumu!!!
(Te bolja je asp.NET varijanta, te sad taj Ruby...) ;-)

@Nemanja,
cuo sam ja za te izraze, sta cuo, i cit'o cak ponesto, ali mnogo to meni apstraktno zvuci.

Ne sumnjam ja a u prednosti OOP, daleko bilo, samo sam pomislio da postoji neka oblast, neki php problem koji bi mi dobro 'legao' za vezbu, gde bi do izrazaja dosle te i druge prednosti/pogodnosti...
[ Nemanja Avramović @ 21.06.2008. 17:23 ] @
Evo ti polimorfizam objašnjen na odličnom primeru (bez zezanja ): http://www.kuro5hin.org/story/2006/3/14/175929/544
[ kelja @ 21.06.2008. 17:37 ] @
Ha ha, ovo sam jos davno video, postovao si to vec ovde, to su oni brezobrazluci.

E sad, bez zezanja, ima li smilsa napraviti nesto kao, recimo, klasu za paginaciju?

(Posto mi se vec sa loginom i validacijom nije posrecilo) ;)
[ Nemanja Avramović @ 21.06.2008. 17:54 ] @
Pa to jesu bezobrazluci ali odlično objašnjavaju polimorfizam

Takođe, verujem da znaš, ali ipak da pomenem: Pogledaj www.phpclasses.org - tamo ima dosta klasa koje možeš koristiti i iz kojih možeš učiti OOP. Kad sam već kod tog sajta, pogledaj ovo.
[ Mister_rap @ 21.06.2008. 19:02 ] @
Preporucujem ti pregledas neku knjigu poput ove:
http://www.amazon.com/Object-O...ss-Matt-Weisfeld/dp/0672318539

Ako budes nekad koristio neki framework za php moraces da znas oop jer ces nasljedjivati postojece klase i slicno...
Za pocetak mozes da napravis DB klasu recimo ili krenes da radis neki ShoppingCart...
[ kelja @ 21.06.2008. 19:59 ] @
Hvala ljudi, kad napravim svoje prvo OOP cedo, postavicu ga ovde, a vi onda kritikujte! ;-)
[ jablan @ 22.06.2008. 20:48 ] @
Citat:
kelja: He he he, @jablane ti konstantno podrivas ugled php-a, i to na php forumu!!!

Pa red je i ljudi ovde da saznaju da ima nešto bolje... :)

Šalu na stranu, mislim da si preskočio deo moje poruke, tj. postoji i dosta PHP frejmvorka koje, doduše, nisam gledao, ali pretpostavljam da se dosta baziraju na OOP-u.

Počni od sledeće stranice:

http://www.mustap.com/phpzone_post_73_top-10-php-mvc-frameworks
[ dakipro @ 23.06.2008. 17:11 ] @
Evo praktican primer oop na primeru db layera.
Sve sto ubacujes u bazu i vadis iz nje od sad koristis kao objekat, iniciras ga recimo ovako:

Code:


class Menu extends Object  {
  function Menu () {
        global $db;
        $this->db = $db;

        $this->tableName = TABLE_EXT . "menu";
        $this->ids = array("menu_id");

        $this->initProperty('menu_id', new IntType());

        $foreignKeyObj = new ForeignKey('MenuCategories', 'cat_name');
        $foreignKeyObj->setAttributes(array("onchange"=>"getSelectBoxElements(this)"));
        $foreignKeyObj->setDefaultSelectedValueId(getGET('fk_category_id'));

        $this->initProperty('fk_category_id', $foreignKeyObj);

        $this->initProperty('base_name', new TextField());

        $parentObj = new InternalKey('Menu', 'base_name');
        
        $this->initProperty('parent_id', $parentObj); 
        $this->initProperty('url', new UrlType());
        $this->initProperty('is_active', new CheckBox());
        $this->initProperty('ordering', new IntType());

                $imgObj = new ImgFile('image_file');
        $imgObj->setUploadDir(UPLOAD_DIR . "menus/");
        $imgObj->setUploadUrl(UPLOAD_URL . "menus/");
        $imgObj->makeThumb = false;
        $imgObj->resizeImage = true;
        $imgObj->imageHeight = 50;
        $imgObj->imageWidth = 50;
//        $imgObj->thumbHeight = 0;
//        $imgObj->thumbWidth = 0;

        $this->initProperty('image_file', $imgObj);



  }
}
        


I sad, svaki tip propertija ima svoje atribute i svojstva (sta vise, svaki property je sam objekat) Ovo je copy-paste, cisto za ideju, da ne objasnjavam sta svaki radi ponaosob (ako te interesuje, pisi).
Cela draz svega toga je upotreba objekta.
Kad pravis novi objekat (instancu objekta) setujes mu vrednosti ovako:

$menusObj = new Menu();
$menusObj->setProperties($_POST); //setuje sve vrednosti koje objekt poseduje, a nalaze se u postu ili bilo kom nizu (veoooma korisno kod velikih formi)
$menusObj->setProperty('is_active', getPOST('is_active', 0)); ///setuje pojedinacni property

i onda snimanje u bazu izgleda ovako:

$menusTransObj->store();

Kad ga editujes, izgleda prilicno isto:


$menusObj = new Menu();
$menusObj->get($menuId); //iz baze se izvade vec njegove sve vrednosti, tj uradi se select where id = $menuId
$menusObj->setProperties($_POST); //setuje sve vrednosti koje objekt poseduje, a nalaze se u postu
$menusObj->setProperty('is_active', getPOST('is_active', 0)); ///setuje pojedinacni property

i onda snimanje u bazu izgleda opet ovako:

$menusTransObj->store();

Objekat zna da li je iniciran "na prazno" tj da li je upravo kriran ili je get()-om izvucen iz baze pa prema tome bira koji ce sql da koristi.

Brisanje objekta izgleda ovako:

$menusObj->get($menuId);
$menusObj->delete();

Prednost je recimo sto ce se svaki property pobrinuti oko brisanja sopstvenih elemenata ukoliko su dodatni (brisanje sopstvenih slika i fajlova recimo)

kad ti treba neki property objekta, to je

$vrednost = $menusObj->getProperty('is_active');

Sve ove metode se same brinu oko toga da li su required, kog su tipa, kako se validiraju, kako se obradjuju pri unosu i pri citanju iz baze itd.

Crtanje forme za editovanje i kreiranje moze da izgleda ovako:

$smarty->assign('formElements', $menusObj->drawFormElements());

Gde ce svaki property u zavsnosti od sopstvenog tipa vratiti odgovarajuci element u formi.
Postoji i opcija za pretragu, pravljenjem kriterija objekta, na slicnu foru.

Paginacija se uz pomoc ovakvu unapred poznatu strukturu i metode objekta pravi recimo:

$pagin = new Pagin();
$itemsObj = $pagin->createPagin($itemsObj, $criteria, 'user_per_page', $config['products_per_page']);

i paginacija ce sama da pozove metode getObjects, kao i countObjects na osnovu $criteria objekta koji sadrzi pravila za formiranje sql upita i da kreira sve potrebne parametre. Ako treba nesto posebno da joj se setuje, dopise se nova metoda.

I sad najbolji deo: ovaj kod je potpuno identican (osim naravno kreiranja samog objekta) za bilokoj tip podataka koje skladistis u bazi. Useri, Proizvodi, kategorije, oglasi, vesti, baneri, galerije, sta god ide i cita se iz baze (cak i ne mora iz baze, prosiris metodom koja ti treba). Ako pak neki entitet u bazi ima poseban zahtev za recimo Store metodom, samo je napises u nasledjenoj klasi.
Posle nekog vremena upotrebe, sky is the limit ;)

Da ne spominjem ustedu vremena u pisanju 20-30 linija koda za kompletnu administraciju celog dela sajta sa svim procedurama unosa/editovanja/brisanja...
Kasnije samo uzmes kopiras ceo admin fajl, i samo find-replace Menu with User.

Credits kolegama Bati i Malisi koji su inicirali i podelili ideje, sad dal je ovo neki standard, ne znam.