Jump to content

Kratak uvod u OO PHP


Recommended Posts

Ova tema sluzi kao kratak tutorijal Objektno Orijentisanog nacina programiranja u PHP-u.

Takodje svrha teme je da pomogne ljudima da shvate osnovne pojmove, kao i razliku u odnosu na obicno (proceduralno) programiranje.

Na kraju cilj je da sto vise ljudi prihvati ovakav nacin programiranja, jer na kraju guramo vec skoro desetu godinu 21. veka :)

 

Trudio sam se koliko sam mogao da sve bude na Srpskom, neke stvari se jako tesko ili skoro nikako prevode, ako neko ima nekih predloga nek slobodno iznese..

 

 

Uvod: Zasto OO?

 

Zato! :)

 

Razloga stvarno ima milion:

- kod se lakse odrzava

- kod sam sebe objasnjava (dobro dodje kad otvoris projekat od pre 2 godine)

- veca kontrola nad kodom (videti 1.4)

 

Postoji urbani mit da OO PHP usporava vase skripte, taj mit je delimicno istinit, ali je to "usporenje" toliko minorno da se u 99.99% slucajeva opusteno moze zanemariti.

Sa druge strane benefit je ogroman.

 

 

1) Osnove i Pojmovi

 

Za pocetak, posto ljudi stalno mesaju pojmove funkcija, klasa, metoda, objekt, varijabla, property....

Da malo objasnimo stvari

 

 

1.1 Klase

--------------------------------------------------

 

Ovo je primer klase

Class Pas{

    private $telefonVlasnika;
    public $ime;
    
    function podesiImePsa($ime){
        $this->ime=$ime;
    }
    
    function podesiTelefonVlasnika($brojTelefona){
        $this->telefonVlasnika=$brojTelefona;
    }
    
    function procitajTelefonVlasnika(){
        return $this->telefonVlasnika;
    }
    
    function podesiRasu($rasaPsa){
        $rasa='Rasa Podesena na: '.$rasaPsa;
        $this->rasa=$rasaPsa;
        
        return $rasa;
    }
}

 

 

1.2 Objekti

--------------------------------------------------

 

Klasa je samo nacrt, definicija kako objekat treba da izgleda.

Da bi mogli da koristimo sam objekat moramo prvo da ga inicijalizujemo

 

$mojPas=new Pas();

 

$mojPas je objekt

$mojPas je instanca klase Pas

$mojPas nije klasa

 

 

 

 

1.3 Metode

--------------------------------------------------

sada cemo podesiti ime i telefon vlasnika psa

 

$mojPas->podesiImePsa('Rex');
$mojPas->podesiTelefonVlasnika('+381 66 666 666');

 

podesiImePsa() i podesiTelefonVlasnika() su metode klase, ne funkcije iako ispred njih u definiciju klase stoji function

 

 

 

1.4 $this

--------------------------------------------------

Jedna od najvecih prepreka pocetnicima pri ucenju prestavlja famozna $this pseudo-varijabla

posto smo property ime i telefonVlasnika definisali van metoda da bi smo im pristupili unutar metode moramo staviti $this->ime

 

takodje ako iz jedne metode pozivamo drugu, to isto radimo sa $this->nekaDrugaMetoda();

 

$this je najlakse shvatiti kao link ka metodama i propertijima objekta.

takodje, u okviru metoda mozete definisati normalne varijable, za recimo privremene operacije

    function podesiRasu($rasaPsa){
        $rasa='Rasa Podesena na: '.$rasaPsa;
        $this->rasa=$rasaPsa;
        
        return $rasa;
    }

 

$rasa i $this->rasa uopste nisu iste varijable.

 

echo $mojPas->podesiRasu('opak Pas'); // vraca: Rasa Podesena na: opak Pas
echo '<br />';
echo $mojPas->rasa; // vraca: opak Pas

 

takodje ne postoji nacin da pristupite lokalnoj (obicnoj varijabli) jednom kad se objekat inicijalizuje, osim da je vratite kroz return

 

naprimer da smo imali jos jednu varijablu u okviru metode podesiRasu()

recimo $proba='pboba'; kasnije ne bi smo mogli da mu pristupimo kroz inicijalizovan objekat. tj $mojPas->proba nece vratiti nista.

 

 

1.5 Object properties

(ne znam kako se ovo prevodi u domacoj literaturi)

--------------------------------------------------

 

$ime i $telefonVlasnika su properties, to mu dodje kao varijable u proceuralnom programiranju s tim da ovde

imate vecu kontrolu. kontrola se odnosi na public - private svojstva propertija.

primeticete da je ispred imena public a isred broja telefona private

 

ako ispod ovoga ubacimo sledeci kod

echo $mojPas->ime; // ovo vraca Rex
echo $mojPas->telefonVlasnika; // ovo vraca Fatal error: Cannot access private property Pas::$telefonVlasnika

 

to znaci da propertiju telefonVlasnika ne moze pristupiti direktno, vec samo preko metode koja vraca taj property

takodje mozemo direkno menjati public propertije

 

$mojPas->ime='Rex Prvi'; 
echo $mojPas->ime; // ovo vraca Rex Prvi

 

ako to isto pokusamo za telefonVlasnika

 

$mojPas->telefonVlasnika='+381 66 999 999'; // ovo vraca Fatal error: Cannot access private property Pas::$telefonVlasnika

 

da bi smo procitali property koji je private moramo napisati metodu koja ga vraca, u nasem slucaju to je procitajTelefonVlasnika().

echo $mojPas->procitajTelefonVlasnika(); //vraca: +381 66 666 666

 

Link to post
Share on other sites
  • Replies 71
  • Created
  • Last Reply

Top Posters In This Topic

Toliko za prviu lekciju

evo i cele skripte

<?php

Class Pas{

    private $telefonVlasnika;
    public $ime;
    
    function podesiImePsa($ime){
        $this->ime=$ime;
    }
    
    function podesiTelefonVlasnika($brojTelefona){
        $this->telefonVlasnika=$brojTelefona;
    }
    
    function procitajTelefonVlasnika(){
        return $this->telefonVlasnika;
    }
    
    function podesiRasu($rasaPsa){
        $rasa='Rasa Podesena na: '.$rasaPsa;
        $this->rasa=$rasaPsa;
        
        return $rasa;
    }
}



$mojPas=new Pas();

$mojPas->podesiImePsa('Rex');
$mojPas->podesiTelefonVlasnika('+381 66 666 666');

echo $mojPas->ime; // ovo vraca Rex
echo '<br />';

//echo $mojPas->telefonVlasnika; // ovo vraca Fatal error: Cannot access private property Pas::$telefonVlasnika


$mojPas->ime='Rex Prvi'; 
echo $mojPas->ime; // ovo vraca Rex Prvi
echo '<br />';

//$mojPas->telefonVlasnika='+381 66 999 999'; // ovo vraca Fatal error: Cannot access private property Pas::$telefonVlasnika
echo $mojPas->procitajTelefonVlasnika(); //vraca: +381 66 666 666
echo '<br />';


echo $mojPas->podesiRasu('opak Pas'); // vraca Rasa Podesena na: opak Pas
echo '<br />';
echo $mojPas->rasa; //vraca: opak Pas


?>

 

dve linije su zakomentarisane jer vracaju fatal error, mozete otkomentarisati i probati

Link to post
Share on other sites

evo dok kodi ne napishe evo malog tizera, u dve rechenice sazeto o $this-u

U objektno orijentisanom programiranju, da uprostim, pored rada sa variablama korste se i objekti koji su isto kao i varijable zapisani u radnoj memoriji i prestavljaju instance svojih klasa.Unutar definicije klase property-ima i metodama pristupamo preko $this-> (ovde govorim o php-u da se razumemo) i bash to $this predstavlja instacirani objekat...nzachi iz onog primera imamo objekat klase pas koji se zove moj pas i to $this predstavlja mog psa, znachi u kodu pozivam metode mog psa koristeci $this->neshto_neshto , shto kad bi se prevelo na srpski zvuchalo Ovo je moj pas, njegovo->ime je Rex, njegov->gazdaBrTel je xx-xxx-xxx...znam da je sve to konfuzno sad....teshko je obasniti nekome ko ne zna samu srz programiranja.Evo da pokusham da objasnim josh neshto. Postoji josh jedan operater :: , zaboravih kako se zove na srpskom ali na engleskom je scope operator, kada se koristi self::neki_metod_static_property ili parent::neki_metod_ili_static_property poziva se metod ili property direktno iz klase a ne iz objekta...uf, a mislio sam da cu lako da objasnim u dve rechenice, valjda nisam josh vishe zbunio :(

 

 

 

edit: sad vidim da je i kodi objasnio $this...ma nek ide zivot......

Link to post
Share on other sites

@stain, premestio sam ti poruku iz one teme,

 

@ostali - slibodno ako imate pitanja u vezi ovoga, ili generalno u vezi OOP pitajte ovde pa cu se ja ili neko drugi potruditi da vam to objasnim.

Link to post
Share on other sites

da li php podrzava dot notation ($this.telefonVlasnika), i ako podrzava, da li je preporucljivo tako pisati kod, koliko ljudi uopste pise tako ?

 

skoro sam uzeo da citam malo o php-u, nisam jos nasao vremena da se malo igram. vise me zanima kako on radi under-the-hood, sta se desava nakon izvrsenja php skripte, sta se desava ispod haube kada vise korisnika poziva isti php fajl, da li se mogu u memoriji cuvati neki podaci nevezano za sesiju (npr da li je moguce napraviti page visit counter bez da se taj podatak zapisuje igde), kako sesije ulaze u ovu pricu sa OOP-om itd.

 

jel postoji neki guide za one koji ne zele da uce programiranje nego bi samo da ulete u php? neki cheat-sheet, best practices?

 

takodje, sto se tice i MySql-a, da li postoji neki guide koji pokriva sve na sta treba paziti sto se tice sigurnosti ?

 

mozda bi bilo dobro da se komentari prebace u drugu temu a ova da se ostavi samo za kodijeve postove

Link to post
Share on other sites

nema dot notation

 

mora $this->param

ili $this->method();

 

mada moze iz metode da se poziva sa self::otherMethod i parent::parentMethod();

 

 

sto se tiche in memory i vise usera za jednog korisnika

postoji APC .... to je extenzija, mada ce postati deo php6

APC je opcode cache, tj ako neko jednom pozove fajl od ga kesira u memoriji i ne kompajlira u run time-u svaki put

 

APC takodje moze da drzi coutere u mem ali je to bad practice, jer ako se restartuje server to ode :)

U APC se obicno ucitavaju parametri konfig fajla ili konekcije ka bazi posto se ti fajlovi obicno ucitavaju na svaki reload pa ti se najvise isplati da njih stavis u mem

 

takodje postoji i memcached, koji ima odlicnu podrsku za php, koji je (ukratno) ogromna distribuirana hash tabela

 

The system is used by several very large, well-known sites including YouTube[2], LiveJournal, Wikipedia/Wikimedia, Wikia, SourceForge, Metacafe, Facebook[3] [4], Digg, Twitter[5], Fotolog, The Pirate Bay[6] and Netlog.[7]

 

sto se tiche literature, skroz cool su sitepointove knjige

 

http://www.sitepoint.com/books/phpant2/

http://www.sitepoint.com/books/phpant1/

 

(takodje su skroz u duhu topic-a)

Link to post
Share on other sites
  • 2 weeks later...

Poshto sam reshio da radim neki sajt(ove) iznova krenuh sa radom jer znajuci da cu tako najlakshe skuziti neke stvari. CodeIgniter stoji u pozadini za neki drugi projekat sad hocu ruchno da uradim jedan prostiji sajtic, vezbe radi.

Problem se javio u medjusobnoj komunikaciji unutar same klase, tj. medju metodama.

Naime unutar klase imam nekoliko metoda koji ponaosob rade specifichne stvari kod kreiranja stranice. Pridrzavajuci se pravila da svaka metoda treba da radi samo jedan posao tako sam i zapocheo rad. Medjutim shta kada treba rezultat koji je jedna metoda dobila prebaciti unutar druge koja npr. generishe html kod. Dacu vam prost primer:

 

Metoda _createBody() - njena uloga je da kreira HTML kod web stranice...

function _createBody()

{

$this->page = <<<EOD

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US">

<head>

<title> ************ </title>

</head>

<body>

</body>

</html>

EOD;

return $this->page;

}

 

Metoda _getPageTitle() - ovde je npr. prost return ali na pravom sajtu ona bi dobijala svoj rezultat iz baze.

function _getPageTitle()

{

return "Ovo je naslov nashe stranice";

}

 

Hteo bih rezultat metode _getPageTitle() da ubacim u prvu metodu _createBody() na mesta gde su ****** i nece da radi.

Ukoliko probe radi unutar konstruktora definishem $this->pageTitle = "Naslov moje strane" (kako se sove ovo; property atribut.. ???) i ubacim ga unutar metode kao $this->pageTitle ono radi OK.

Verujem da je problem u nasledjivanju iliti scope-u ali josh nisam radio sa time tako da cjenim svaku pomoc...

Eto, taman ideja Kodiju za drugi deo nastavka :)

Link to post
Share on other sites

eh, pogazio si prvi i najbitniji princip: razdvajanja koda i prezentacije :)

 

ovo se jednostavno ne radi ovako, evo skica boljeg nacina, mada opet daleko od savrsenog:

 

recimo da radis stranicu aboutUs i da link vodi na /about.php

 

tu imas seledeci kod:

<?php

include('Template.php');

error_reporting(E_ALL);
$secret='neka velika tajna';

//----------------------


//inicijalizuj template klasu
$template=new TemplateEngine();
    
$title='Nas Divni Title'; // ovo moze da dodje iz baze, ili bilo kog izvora

// dodeli 
$template->assign('pageTitle',$title);
    
//render template
$template->render('about.tpl');

?>

 

zatim imas sam template, about.tpl

<html>
<html>
<head>
    <title><?php echo $this->v_pageTitle; ?></title>
</head>
<body>
<h2>Helooo :]</h2>

<?php echo $secret; ?>
</body>
</html>

 

i na kraju najprostiju mogucu klasu za render templejta i dodelu varijabli

Template.php

 

<?php
class TemplateEngine{
    public function assign ($name='', $value='' ){
        //dodela vrednosti, sa tim sto cemo dodati prefix v_ ispred
        $name='v_'.$name;
        $this->$name=$value;
    }
    
    function render($templateName){
        include_once($templateName);
    }

}
?>

 

znaci u cemu je poenta:

NIKAD, ALI NIKAD ne smes imati html kod u php fajlovima.

prvo pravilo.

 

Ovako uvek mozes da das nekom peri da ti sredjuje templejte, css, da radi redizajn i sve sto on treba da zna od php-a je da ne dira ono sto je unutar <?php ?> ili eventualno da uradi echo i MOZDA foreach... a to se nauci za 4 minuta.

 

druga stvar je sto se iz template fajlova moze pristupiti SAMO propertijima koje si ti dodelio preko metode assign

(pokusaj da se uradi echo $secret baca warning )

 

tipa ako hoces da preneses broj proizvoda iz neke kategorije, recimo televizora

u php fajlu

$tvCoount= // pa izvadis iz baze broj
$template->assign('brojTelevizora',$tvCount);

 

a onda u tpl fajlu uradis

<p>Ukupno televizora: <?php echo $this->v_brojTelevizora; ?></p>

 

mozda na pocetku deluje kao overkill... i mozda ti smeta sto za sve moras da imas 2 fajla.. ali jbg, tako treba

tako mora :)

 

e sad implementacija na tebi, mozes od pocetka svoj template engine da pises, mozes da nadogradjujes ovu jednostavnu klasu... mozes da koristis smarty ....

Link to post
Share on other sites

takodje svestan sam da ovo i nije bas najdirektniji odgovor na tvoj problem, ali ako imas problema o komunikaciji izmedju metoda, daj neki drugi primer, nesto sto ne ukljucuje HTML :)

 

njemu jednostavno nije mesto tu, on ide u template fajlove, oni su V (view) u MVC i moraju biti odvojeni od koda.

 

neki pametni ljudi mnogo pre mene rekli tako. :)

 

 

----------------------------

 

evo kratak primer

<?php
Class Test{
    
    function prikaziRezultat(){
    
        $output='Rezultat iz baze: '.$this->izBaze();
        return $output;
    }
    
    function izBaze(){
    
        $nestoIzBaze=' 145 proizvoda!';
        return $nestoIzBaze;
    }


}



$t=new Test();
$zaPrikaz = $t->prikaziRezultat();

echo $zaPrikaz; // ovo vraca: Rezultat iz baze: 145 proizvoda!

?>

Link to post
Share on other sites
  • 1 month later...

procitah ovo, ali i dalje ne shvatam koja je razlika izmedju oop i proceduralnog, bas sam tupav :(

ali hajde da vidimo, glavni razlog za primenu oop-a je da se razdvoji php kod od templejta? i onda se u templejt samo doda neka funkcija ili klasa koja izvrsava to, tako da gore pomenuti pera :) na mesto menija treba da doda samo <?php echo function(); ?>?

 

da li je wordpress uradjen na nacin oop-a? jel ako jeste onda je dobro, jer ja sve vreme koristim oop a nisam ni svestan toga :D

 

i ove klase ne kapiram bas... jel one u sustini predstavljaju grupaciju vise funkcija?

 

ufff, pitanja su stvarno bez veze, ali ako to razjasnim bice mi mnogo lakse :)

 

dopuna:

kodi u prvom primeru si na 2 razlicita nacina uneo ime psa:

$mojPas->podesiImePsa('Rex');
$mojPas->ime='Rex Prvi';

e sad, meni je nekako logicnije da se ide preko funkcije, jer u toj funkciji mozda ima jos parametara koji treba da dobiju tu vrednost. da li mi je razmisljanje ispravno ili je sve jedno kako se unose podaci?

Link to post
Share on other sites

to sam stavio da pokazem da ako je property public da ga mozes podesiti i direktno.. ako je private (kao nprm telefon) onda ne moze direktno vec preko metode (sto bi ti reko funkcije)...

 

glavni benefit nije razdvajanje, tome sluze template engine.. glavni benefit je bolja organizacija i lakse odrzavanje (posebno na vecim projektima)

 

i takodje, to tako treba jer ja tako kazem :D

samo mi veruj na rec :D

 

Link to post
Share on other sites
$mojPas->podesiImePsa('Rex');
$mojPas->ime='Rex Prvi';

e sad, meni je nekako logicnije da se ide preko funkcije, jer u toj funkciji mozda ima jos parametara koji treba da dobiju tu vrednost. da li mi je razmisljanje ispravno ili je sve jedno kako se unose podaci?

 

Well, kada imas deklarisanu public varijablu sigurno neces pisati funkciju(method) u kojoj se samo ona unosi, to je stavio kao primjer.

Deklarises je na pocetku koda i koristi je vise funkcija.

Ako tu varijablu treba mijenjati kasnije, onda mislim da je prilicno svejedno da li ces je ponovo mijenjati direktno ili ces dodavati jos jedan parametar funkcijama!

I da, zarad cistoce controllera, kad ako imas vise od jedne varijable, da ne bi pisao

 

$klasa->var1 = '1';
$klasa ->var2 = '2';
$klasa->var3 = '3';
$klasa->method()

 

ubacis sve u method...

 

$klasa->method('1', '2', '3');

 

pa poslije u methodu razvrstavas sta je sta!

 

Link to post
Share on other sites

Klase sa loginom funkcionisu kao i bilo sta drugo sa loginom - posaljes unesene podatke nekom methodu klase, tj.

 

$klasa->login($username, $password)

 

Zatim ih u login methodu filtriras (stripslashes, mysql_real_escape_string), pogledas ima li u bazi korisnik sa tom username/password kombinacijom i selektujes ga, zatim uneses u session ili cookie njegove podatke pa iste proveravas na pocetku svake stranice sa nekim methodom - $klasa->checkLogin() - else redirektujes na login (ili includujes login formu), ako je nesto petljano sa cookiem (tj. setovan je username/password ali ne postoji ta kombinacija u bazi) izbacis neki warning, ako je sve super, izlistas neke podatke, npr. dobrodosli $korisnik, poslednji put ste nas posjetili $datumvrijeme itd itd :)

Ako treba detaljnije, da se napise neki step-by-step tutorial, reci!

Link to post
Share on other sites

znam kako da napravim login skriptu... ja to radim sa formom koja redirektuje na stranicu checklogin.php gde varijable prodju kroz stripslashes i mysql_real_escape_string i onda se samo proveri da li postoji u bazi, ako postoji, sesija se registruje, ako ne ispisuje se poruka o gresci i to je to, jako jednostavno u 15-ak redova.

 

e sad tutorial za login koji je radjen ds klasama je ovaj. iskren da budem ja tu ne kapiram skoro nista... inace kad sam ucio pre nekoliko meseci bas login, radio sam sa ovim tutorialom.

 

sad meni je malo glupo da trazim, ali bilo bi mi od velike koristi ako bi neko mogao da napravi neku login skripticu ili bilo kakvu skriptu koja radi sa mysql bazom da vidimo kako to radi na delu :)

 

i hvala puno na strpljenju!

Link to post
Share on other sites

de nadje onaj tutorial :lol:

Iz svega ovoga shto pishesh vidim da si bash zbunjen, imam utisak da ti mislish da su "klase" samo jedan nachin programiranja koji je vishe fensi od pisanja funkcija. Da shvatash pravu svrhu vreovatno bi sad mogao da shvatish koliko je besmisleno napraviti "login sa klasama" da bude celina sam za sebe, mislim moze to da se uradi, ali opet bi to predstavljalo samo demonstraciju i nichemu ne bi moglo da ti sluzi,tj da kazesh ovako se to radi u pravoj web aplikaciji.Ovako je svejedno kako ga pravio, ako nije deo nekog veceg koda.

 

Pretpostavljash da autorizacija sama mora da se provlachi kroz svaki segment koda, ona odredjuje ko shta moze, a ko ne moze, gospodar CRUD-a (create read update & delete), shto znachi da se ne svodi samo na: upishi u sesiju da je korisnik ulogovan, redirektuj ga na stranu...profit???.Ok ovo je mozda sad slab primer jer stvarno zarad demonstracije mogu se zanemariti ostale metode, ali shta je sa pristupom bazi?Pristup bazi i sanitizacija predstavalja ogromnu celinu za sebe, a opet je povezan ko crevca sa autorizacijom zbog kontrole nad CRUD-om i ti ako ne poznajesh osnove objektnog programiranja necesh imati pojma shta se tu deshava. Pokushavam da ti objasnim da prvo morash da savladash programiranje pa tek onda da pochesh neshto da pravish, zagrej stolicu, pozajmi par knjiga iz torrente biblioteke o OOP-u i coding patterns-ima. Dosta me je iznenadilo sad shto ja nisam pisao sistem za logovanje korisnika bar dve godine, ako ne i vishe, a ni otvaranje konekcije ka bazi :D da budem iskren, ima pametnijih stvari za programiranje :)

Objektni pristup je neshto shto mora da se shvati kao filozofija a ne kao primena u php-u, neko je na forumu skoro napisao hocesh da radish na nekom frameworku a ne znash php - ja bi to ispravio hocesh da radish na frameworku a ne znash da programirash.Au raspisah se ja...a treba da zavrshim neke plugine za wodpress - e to je tek krsh od koda, pa ja sam lepshe pisao kad sam tek uchio, nema extendovanja nema nichega, sve samo preko hookova, a tako me svrbi da mu ishakujem kod iako znam da ce me sjebati svaki sledeci update...slatku muku josh niko ne popi da je gorkom mukom ne zagrchi :(

Link to post
Share on other sites

ma tutorial sam izguglao :) uf, problem je sto ja shvatam kako funkcionisu klase kroz primer koji je kodi napisao u prvom postu, ali da me prebijete ne mogu da shvatim kako prakticno da primenim klase u radu sa bazom. gledam kod od wordpress-a, ali ne mogu bas da povezem, ogromna je to skripta...

 

e sad, razmisljam da nadjem primer i ajde da vidim da li je ovo poenta: imamo neku shop skriptu i sad je nama potrebno da nadjemo sve proizvode koji su u bazi i njih je moguce izlistati na osnovu recimo kategorije, cene ili zemlje porekla i to se definise jednom klasom. e sad nama je potrebno da se ta pretraga unapredi na godinu proizvodnje i mi cemo za to da napravimo novu klasu, koja koristi prvobitnu, s tim sto cemo dodati mogucnost pretrage po godini proizvodenj. (mada primer i nije nesto jer smo mogli i godinu proizvodnje da stavimo u prvu klasu, ali me samo zanima da li tako da trazim poentu zasto oop bolje od proceduralnog?)

 

e sad koliko shvatam, nije potrebno praviti klase za nesto sto se moze prosto resiti sa jednom funkcijom, vec samo za one slozenije stvari? ili opet gresim?

 

ja sam do sada radio samo jednostavnije cms-ove, radjene proceduralno, template odvojen od php-a i to sasvim lepo funkcionise... ali kao sto kodi kaze, ovo je neko pametan smislio i rekao da je dobro, tako da moram da se pomucim :)

Link to post
Share on other sites
ja sam do sada radio samo jednostavnije cms-ove, radjene proceduralno, template odvojen od php-a i to sasvim lepo funkcionise... ali kao sto kodi kaze, ovo je neko pametan smislio i rekao da je dobro, tako da moram da se pomucim :)

Sad kad znas sta su klase, objekti, methodi i kako funkcionisu, kad krenes pisati nesto proceduralno orjentisano, samo ce ti se ukazati da bi to bolje i lakse bilo odraditi OOP-om! Hocu da kazem da se ne moze sve citanjem nauciti, npr. pogledaj sad kroz sav kod tvog cms-a i probaj to zamisliti u oop stilu!

 

Podrzavam zlatiborca, staine, reci nesto vise o hookovima!

Link to post
Share on other sites

vi naravno znate da je WP sve osim OO?

 

ako cemo o hook-ovima.. onda bi to trebalo da odradimo ljudski.. tj observer pattern.

evo sad krecem u pisanje.

------

 

ali ipak ne o tome, ipak je to previse za drugu lekciju, napisacu nesto jednostavnije, imamo mi jos da guramo do interfejsa

Link to post
Share on other sites

2) Nasledjivanje

 

 

Nasledjivanje znaci da jedna klasa moze naslediti sve javne metode i propertije druge klase

u ovom primeru smo definisali tri klase.

Jedna je opsta klasa Osoba, lepo je da svaka osoba ima ime, tako da tu definisemo metodu za podesavanje imena.

 

Takodje definisemo metodu pozdrav.

 

sada mozemo uraditi ovo

Class Osoba{
  public $ime;

  function podesiIme($ime){
    $this->ime=$ime;
  }
  
  function pozdrav(){
    echo 'Dobar dan, ja sam '.$this->ime.'.';
  }


}

$osoba1=New Osoba();
$osoba1->podesiIme('Mika');
$osoba1->pozdrav(); // vraca: Dobar dan, ja sam Mika.

 

 

Sledeca klasa je Lopov, i lopov je osoba, tako da bi bilo totalno glupo ponovo definisati metodu podesi ime.. ime je ime, zajednicka stvar za sve osobe, bez obzira kog su zanimanja, zato cemo samo naslediti tu metodu od klase osoba, obratiti paznju na keyword extends

 

takodje bilo bi lepo da odmah znamo da je dotichna osoba lopov, zato cemo definisati novu metodu pozdrav u okviru klase Lopov, koja ce dodati opis zanimanja.

 

 
Class Lopov extends Osoba{
  public $opisZanimanja='profesionalni lopov!';
  
  function pozdrav(){
    echo 'Dobar dan, ja sam '.$this->ime.', '.$this->opisZanimanja;
  }

}

  
$osoba2=New Lopov();
$osoba2->podesiIme('Pera');
$osoba2->pozdrav(); // vraca: Dobar dan, ja sam Pera, profesionalni lopov!

 

znaci ako i parent i child klasa imaju metodu sa istim nazivom uvek ce se izvrsavati ona metoda ciji smo objekt inicijalizovali.

 

 

cela skripta

<?php

Class Osoba{
    public $ime;

    function podesiIme($ime){
        $this->ime=$ime;
    }


}


Class Lopov extends Osoba{
    public $opisZanimanja='profesionalni lopov!';
    
    function pozdrav(){
        echo 'Dobar dan, ja sam '.$this->ime.', '.$this->opisZanimanja;
    }

}


Class Politicar extends Lopov{
    function __construct(){
        $this->opisZanimanja='politicar i gospodin chovek!';
    }
}


$osoba1=New Osoba();
$osoba1->podesiIme('Mika');
$osoba1->pozdrav(); // vraca: Dobar dan, ja sam Mika.

echo '<br>';


$osoba2=New Lopov();
$osoba2->podesiIme('Pera');
$osoba2->pozdrav(); // vraca: Dobar dan, ja sam Pera, profesionalni lopov!

echo '<br>';


$osoba3=New Politicar();
$osoba3->podesiIme('Zika');
$osoba3->pozdrav(); // vraca: Dobar dan, ja sam Zika, politicar i gospodin chovek!

?>

 

ili ovde

http://gist.github.com/134574

 

znaci prevedeno na normalne primere, gde god imate nesto sto je opste (osoba) i nesto specificno (lopov) uvek treba opste stvari kao sto je ime u nasem primeru staviti u tu opstu klasu i posle koristiti iz drugih klasa preko nasledjivanja.

Link to post
Share on other sites

Pozdrav Kodi. Pratim ovu temu i odlicno je sto se neko trudi da pojasni neke osnovne stvari + sve to na srpskom jeziku.

Imam jedno pitanje

Sta znaci string escape?

Npr. Citam tutorial na w3school

 

PHP runs addslashes() on all GET, POST, and COOKIE data by default. Therefore you should not use addslashes() on strings that have already been escaped, this will cause double escaping. The function get_magic_quotes_gpc() can be used to check thi

 

Sta znaci to have been escaped.

BTW. prijatelji smo i na fb, al tebe tamo nikad nema, pitao bi ja tebe i tamo :D

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...