[ alfa-pro @ 01.10.2010. 19:14 ] @
Imam problem sa klasama odprilike sa logikom. Ne mogu da razumem upotrebu ne znam da li me razumete. Presao sam dosta sto se tice PHP-a ostale su mi klase, imam knjigu iz koje ucim i jednostavno nisam zadovoljan objasnjenjima za klase. Definicije su super objasnjene ali slabo primeri. Ima primer ali kada pogledam taj primer i ostale klase po internetu to su dva razlicita sveta. Od onoga sto sam nam naucio iz knjige jeste.


Struktura Klase
Code:

class ime
{
..............
}


Klasa bez atributa i operacije su beskorisne. Atributi klase se definisu tako sto se unutar definicije kllase deklarise promenljiva (var)

Code:

class ime 
{
  var $atribut1;
  var $atribut2;
}


Operacije se deklarisu kao funkcije unutar klase
Code:

class ime 
{
  function operacija1()
  {
    ......
  }

  function operacija2 ( $parametar1, $parametar2 )
  {
   .......
  }
}



KONSTRUKTORI
construct()
Konstruktor se poziva prilikom pravljenja objekta date klase i obicno obavlja korisne pocetne poslove, kao sto su dodeljivanje pocetnih vrednosti ili izrada zavisnih objekata.

Njiegova glavna svrha je da se automacki poziva prilikom pravljenja objekta.

Code:

class ime 
{
  function _construct ($parametar) 
   {
      echo 'Pozvan je konstruktor sa parametrom $parametar ';
   }
}


Destruktori
Deluju suprotno od Konstruktora.
Destruktori omogucavaju da izvrsimo odredjene akcije pre unistavanja objekta, sto se automacki obavija kada nema nijedne reference koja upucuje na taj objekat. Oni ne mogu imati parametre.


Instanciranje Klase

Posto napravimo klasu treba da napravimo objekte te klase-koji pripada klasi-
Novi objekat se pravi pomocu rezervisane reci NEW
Treba da navedemo ime klase i da zadamo parametre konstruktora.

Code:

class ime 
{
 function _construct ($par)
  {
    echo 'Pozvan je konstruktor s parametrom $par';
  }
}

$a = new ime ('prvi');
$b = new ime ('drugi');
$c = new ime ();



ATRIBUTI KLASE

$this pokazivac koji upucuje na tekuci objekat.

Code:

class ime
{
 var $atribut;
 function operacija ($par)
 {
  $this->atribut = $par;
  echo $this -> atribut;
 }
}


__SET -vraca vrednost atributa
__GET - prihvata jedan parametar


Modifikatori PRIVATE I PUBLIC

PUBLIC - znaci da je pristup javni
PRIVATE - znaci da je pristup privatni


POZIVANJE OPERACIJE KLASE

Code:


class ime 
{
  function operacija1()
  {
    ......
  }

  function operacija2 ( $parametar1, $parametar2 )
  {
   .......
  }
}


$a = new ime();

$a-> operacija1();
$a->operacija2('test1','test2');




NASLEDJIVANJE

EXTENDS

Code:

class B extends A
{
 var $atribut2;
 function operacija2()
 {
  ....
 }


TO JE SVE STO SU NAPISALI.

Evo to je to sto sam naucio iz te knjige ja bi jos ali nema. Ovako kako sam napisao tako su oni objasnili ja jesam naucio definicije sve sta i kako ali ja ne znam sada to da upotrebim. Ima neki primer u kome je definisan vecinom html.
class page
{
public function Display ()
{
echo '<html><head>';
}
}
i tako dalje sve sam html u klasi vecinom. Dok gledam druge klase po netu to je bas nesto sasvim drugacije od ovoga.
Pa bih zamolio neko iskusniji da mi objasni ukratko sve ovo.
Googlao sam ali vecinom googlam na francuskom jer ENG slabo znam. Nije da ne zanam bas nista ali nije to to. Pa sam zato ovde postavio

Bicu vam zahvalan na odgovorima.
[ vatri @ 01.10.2010. 19:44 ] @
Mozda ti je bolje da zasad preskocis klase, tj. da se ne opterecujes previse sa tim. One jesu mnogo korisne, ali njihovu upotrebu mozes shvatiti tek radom na malo vecim projektima.
Tada obicno (proceduralno) programiranje postane preglomazno, nepregledno, tesko za odrzavanje.
Kako budes sticao iskustvo u programiranju, vidjeces da ce ti se samo nametnuti ;)

Evo ja sam "guglao" i nasao par linkova, ako zelis procitaj - mozda ti bude jasnije nesto

http://tehnika.krstarica.com/l/programiranje/php-klase-i-objekti/

http://www.elitesecurity.org/t83817-Klase-PHP-Koristiti-ih-ili-ne

http://phptutorial.odlican.net/funkcije.php

http://www.link-elearning.com/...g/jedinica.php?IDJedinice=6129

--------

http://www.google.rs/#hl=sr&am..._rfai=&fp=6fa73c47cbd36241


Srecno sa ucenjem i naravno uci engleski, trebace ti...
[ alfa-pro @ 01.10.2010. 19:56 ] @
Ok hvala ti na odgovoru i savetu. Pogledacu ove linkove i probacu ove primere koji su ovde navedeni u linkovima
[ mitke013 @ 02.10.2010. 14:38 ] @
Imas maratonsku raspravu ovde .

U tvom primeru, male ispravke: uvek stavi da li je metoda public ili protected/private. Bitno ti je da imas sto manji API (to ti cine public metode), dok ce prljave stvari raditi protected metode. Da bi sebi MNOGO olaksao ucenje PHP-a, koristi unit testove. Jeste, malo smara pisanje testova, ali ce te zacuditi koliko ce ti API biti bolji, cistiji i naravno, sa minimumom parametara pa je lakse raditi upgrade. Ja sam npr. napravio klasu Image iskljucivo pisuci prvo testove, pa tek onda program sto je pravi test-driven-development. Zahvaljujuci tome, mogu da uradim sledece:
Code:

$image = Image::createFromFile('neki fajl nebitnog imena') ;
if ( $image->isValid() )
  $image->save() ;


i ovo ce automatski iskopirati taj fajl u neki predefinisan dir (moze se promeniti naravno), kreirati thumb i u tabeli image, kreirati novi objekat. Ime fajla se automatski generise u obliku 'file-1332524324.jpg', klasa uopste ne obraca paznju na originalno ime i pazi da se ne prebrise neki drugi fajl. Ako uradis $image->adaptiveResize(100,80)->save() , stari fajlovi se brisu i generisu novi. Ako uradis $image->rename('more')->save(), dobices fajlove tipa 'more.jpg' ili 'more-1.jpg' ako je prethodno ime zauzeto. Itd...

Ovo sam ti naveo kao primer koliko ti testovi olaksavaju kako ucenje OOP-a, tako i bolje i cistije klase.
[ alfa-pro @ 02.10.2010. 17:51 ] @
Mitke ovo test-driven-development je jako dobra stvar. Bez sale pomogla je za sada bar malo a verujem da ce vremenom vise. Hvala ti
[ mitke013 @ 02.10.2010. 21:05 ] @
Citat:
alfa-pro: Mitke ovo test-driven-development je jako dobra stvar. Bez sale pomogla je za sada bar malo a verujem da ce vremenom vise. Hvala ti


Nema na cemu. Ako budes imao problema sa instaliranjem Phpunit-a (njega ja koristim), slobodno pitaj, malo je problematicno ako nisi koristio PEAR ranije. I nemoj da te smori pisanje testova, na duze staze se veruj, veoma isplati.
btw, kad pises test metodu, razmisljaj na sledeci nacin: kako bi voleo da tvoj program izgleda (konkretno kontroler). Znaci zelis minimum koda koji ce samo da izdaje komande klasi modela. I trudi se da nikad ne stavljas logiku u taj test, jer to sto pises u testu ce zapravo posle biti kontroler u tvom programu.
[ alfa-pro @ 13.11.2010. 19:32 ] @
Evo ja sam nesto pokusao da uradim pa sada jel ovo moze da se smatra OOP?
Nesto sam pokusavao da uradim klasu za bazu i samo sam uradio jednostavno konektovanje i selektovanje pa ne znam da li se to na ovakvu foru radi ili sam opet omasio celokupno OOP.

Code:

class Database
{
    private $db_host;
    private $db_username ;
    private $db_password ;
    private $db_name ;
    

    public function __construct ($db_host, $db_username, $db_password, $db_name)
    {
        $this->db_host = $db_host;
        $this->db_username = $db_username;
        $this->db_password = $db_password;
        $this->db_name = $db_name;
        
    }

    //Database connect function
    public function Connect ()
    {
        if ([email protected]_connect($this->db_host, $this->db_username, $this->db_password))
        {
            echo '<b>MySql Error : </b>'.  mysql_error();
        }
        if ([email protected]_select_db($this->db_name))
        {
            echo 'Can not select Database';
        }
        
    }
}



I na kraju je instanciram

Code:

$db = new Database($db_host, $db_username, $db_password, $db_name);
$db -> Connect();


Radi super ali necu pogresno da ucim ako ne valja bolje da vas pitam koji se razumete.
[ mitke013 @ 14.11.2010. 01:29 ] @
Gledaj da bacas exception kod fatalnih gresaka kao sto je nemoguca konekcija ka bazi; bez nje ti program sigurno nece raditi i program mora da stane da bi lakse nasao problem.

Pitanje;
kako si zamislio da koristis tu DB klasu?
[ alfa-pro @ 14.11.2010. 13:05 ] @
Citat:
program mora da stane


Jesi mislio na ovo
Code:

return TRUE;
return FALSE;

ili da gore definisem argument

var $error = '';

Ako gresim molim te ispravi me.

Citat:
kako si zamislio da koristis tu DB klasu?


Pa ovako ja evo iskreno ovo sam radio bzv cisto pokusavao nesto da izvedem i shvatim. Problem je sto ja teoriju znam, znam tacno sta je sta, ali ja jos uvek ne mogu da ukapiram sustinu OOP. Nerazumem namenu classe? To sto sada radim klasama to sam radio i obicnim funkcijama. Znam da se klase koriste pri vecim priojektima a sa funkcijama kod je glomazniji i tesko se snadjes, kada mi treba neka ispravka i dorada. Ne razumem npr evo ja imam funkciju koju koristim stalno za npr DB u njoj imam sve od konekcije do izvrsenja upita itd... I sada napravim klasu ona ce da bude iste velicine kao i funkcija. Mislim kako se onda smatra da kod nije toliko glomazan.? Ok dobro da ne idem u OFF.

Mitke pazi ja sam eto zamislio ovu db klasu tako sto bi je koristio za uspostavljanje veze sa bazom, normalno prosirio bi je gde bi dodao da se izvrsavaju upiti (INSERT, SELECT, UPDATE, DELITE itd..) Ovo je cisto samo test da vidim da li to uopste valja. Radim one unit testove jedan kod pisem po 1000x dok ne dobijem ono pravo. Ali opet mi je sve to nekako nejasno. Evo dajem primer ja klasu za bazu bi nekako zbudzao i to bi radilo to razumem ali da me neko pita uradi klasu za logovanje i registraciju ili uradi kontroler klasu za MVC parent ne bi znao da beknem. Neznam sa php-om sam dosta presao i za kratko vreme sam radio lepe aplikacije, uradio sam i svoj CMS. Svaki dan radim googlam odem na php manuel ne razumem dosta toga jer je sve na ENG. dok su u skoli svi ucili ENG ja sam ucio FRANCUSKI tako da tek ucim engleski ali dobro koliko toliko razumem to je najveci problem. Od srpske dokumentacije sam jedva nesto nasao i to je nesto bzv. Veliki problem je u meni sto sam ja uvek ne zadovoljan sa sobom. Sve sto uradim licno ja to mi se ne svidja i obrisem posle sat vremena...
[ mitke013 @ 14.11.2010. 18:29 ] @
Citat:
program mora da stane
Jesi mislio na ovo
Code:

return TRUE;
return FALSE;

ili da gore definisem argument

var $error = '';

Ako gresim molim te ispravi me.

Ne, bas sam mislio na: Gledaj da bacas exception. To ti je komanda throw new exception('Tvoj tekst') ; Vremenom ces videti zasto da te ne pretrpam informacijama sad. True/false su odgovori na pitanje. Razmisljaj ovako: ja te pitam da li mozes da preneses kamion na ledjima. Ti kazes da ne mozes (TRUE/FALSE). No, ja ti ipak natovarim taj kamion, a ti bacis kasiku (exception)

Citat:
alfa-pro: Pa ovako ja evo iskreno ovo sam radio bzv cisto pokusavao nesto da izvedem i shvatim. Problem je sto ja teoriju znam, znam tacno sta je sta, ali ja jos uvek ne mogu da ukapiram sustinu OOP. Nerazumem namenu classe? To sto sada radim klasama to sam radio i obicnim funkcijama. Znam da se klase koriste pri vecim priojektima a sa funkcijama kod je glomazniji i tesko se snadjes, kada mi treba neka ispravka i dorada. Ne razumem npr evo ja imam funkciju koju koristim stalno za npr DB u njoj imam sve od konekcije do izvrsenja upita itd... I sada napravim klasu ona ce da bude iste velicine kao i funkcija. Mislim kako se onda smatra da kod nije toliko glomazan.? Ok dobro da ne idem u OFF.

Nisi nimalo otisao u OFF. Za razliku od nekih tvojih ranijih pitanja, ovo je zaista veoma dobro. To sam i ja mislio dok sam radio proceduralno; wtf bi stavljao takve funkcije u klasu, sigurno klase nisu izmisljene zbog autoload-a? Ja sam bio forsiran da ucim OOP (sto je dobro), ali skroz losiji pristup od ovoga sto sad radim. Recimo ovo: posle 4 meseca, nisam imao predstave kako da uradim refactoring tog koda. A ja sam ga pisao, pa ti vidi. Umesto da radimo bez parametara (kao sto sad radim), mi smo slali po 2-3 parametra metodama, neki opcioni itd... Totalno pogresno, a na testove smo trosili od 5-8 puta vise vremena nego sto je potrebno. Uradis refactoring; sve ispocetka.
Dokle god postavljas pitanja, na dobrom si putu. Nikako nemoj da se slepo drzis necega sto si procitao na netu; nemoj ni meni ni nekom sa 3 diplome da verujes cisto na rec. UVEK razmisljaj o ponudjenoj ideji, uvek!
Citat:

Mitke pazi ja sam eto zamislio ovu db klasu tako sto bi je koristio za uspostavljanje veze sa bazom, normalno prosirio bi je gde bi dodao da se izvrsavaju upiti (INSERT, SELECT, UPDATE, DELITE itd..) Ovo je cisto samo test da vidim da li to uopste valja. Radim one unit testove jedan kod pisem po 1000x dok ne dobijem ono pravo.

BRAVO! Tako se uci programiranje. Daj da vidim kako izgleda neki test.

Citat:
Ali opet mi je sve to nekako nejasno. Evo dajem primer ja klasu za bazu bi nekako zbudzao i to bi radilo to razumem ali da me neko pita uradi klasu za logovanje i registraciju ili uradi kontroler klasu za MVC parent ne bi znao da beknem. Neznam sa php-om sam dosta presao i za kratko vreme sam radio lepe aplikacije, uradio sam i svoj CMS. Svaki dan radim googlam odem na php manuel ne razumem dosta toga jer je sve na ENG. dok su u skoli svi ucili ENG ja sam ucio FRANCUSKI tako da tek ucim engleski ali dobro koliko toliko razumem to je najveci problem. Od srpske dokumentacije sam jedva nesto nasao i to je nesto bzv. Veliki problem je u meni sto sam ja uvek ne zadovoljan sa sobom. Sve sto uradim licno ja to mi se ne svidja i obrisem posle sat vremena...

Da, ranije sam procitao da ne znas engleski. I slazem se; u velikim si problemima zbog toga, zato cu ti pomoci. Dobro si krenuo, moj mentor mi lepo rekao: 'program je ziv, on se stalno menja'. Koliko god moji klijenti bili zadovoljni mojim radom i programom (a imam zahtevne klijente), ja nisam zadovoljan i uvek hocu bolje.

Ajde ovako da probamo:
koliko ti je problem da naucis sta je Active-Record? Za pocetnika je prilicno lako u odnosu na UnitOfWork. Evo ti hint kroz primer Doctrine 1.2 ORM programa, nisam dobar u teoretisanju:
Recimo da imas tabele Category i Product. One su one-2-many povezane, tj. kategorija ima mnogo proizvoda. U bazi, to znaci da tabela 'product' ima kolonu 'category_id', verujem da si upoznat sa ovim.

U tvom programu hoces da izlistas sve kategorije. Kod za to je:
Code:

$allCategories = CategoryTable::getInstance()->findAll() ;

Vidis; nema SQL-a, ORM se sam brine oko toga. $allCategories ce biti niz sa recimo 5 instanci klase Category; atributi te klase ce biti identicni kolonama iz tabele. Npr. kolona 'name', 'created_at', 'slug' ... itd...

Naravno, Active Record nije napravljen zbog toga, za tako nesto je dovoljan i mysqli. Ali ajde da predjemo na pravu zabavu:
kod ORM-a tipa Doctrine, tvoja klasa Category radi extend BaseCategory, a ona radi extend Doctrine_Record. Metoda delete() se nalazi u Doctrine_Record klasi; sto znaci da ti mozes da ukucas $category->delete(), iako nemas delete() u klasi Category. To ti je primer nasledjivanja, ODLICNA stvarcica, nauci je dobro.

Znaci, ako uradis brisanje kategorije, automatski se brisu i proizvodi. Medjutim, ti zelis da sprecis brisanje kategorija ako ona ima neke proizvode; prilicno logicno, ljudi grese, ovako ih sprecavas u tome. Znaci, prvo sto uradis je da napravis metodu Category::isDeletable() ;
Code:

class Category extends BaseCategory
{
    public function isDeletable()
    {
        if ( count($this->getProducts()) == 0 )
            return true ;
        return false ;
        // cistiji kod je linija ispod, nauci ternary operator
        return count($this->getProducts())==0 ;
    }
    
    public function delete()
    {
        if ( !$this->isDeletable() )
            throw new Exception('Category can not be deleted') ;
        return parent::delete() ;
    }

    public function getProducts()
    {
        return $this->Products ;
        // ili u tvom programu neki drugi tip ucitavanja, ovo je lazy load
    }
}


Kako bi ovo iskoristio? Recimo, u administraciji tvog programa izlistas sve kategorije. Pored imena, hoces da postavis i ikonicu za brisanje; medjutim, neces dozvoliti da se kategorija obrise ako ima neke proizvode. Znaci:
Code:

foreach ($allCategories as $category) {
    echo 'Ime:' . $category->getName() ;
    if ( $category->isDeletable() ) {
        // ikonica za brisanje
    }
}


Objasnjenje:
isDeleteable() ce da vrati true/false u zavisnosti od toga da li je broj pripadajucih proizvoda veci od nule. Nju mozes i da iskoristis u view delu da prikazes ikonu/link za brisanje ili ne.

Medjutim, neko nastavi tvoj rad i u view delu ipak ispise link za brisanje, bez obzira da li moze to da uradi ili ne. Ako kategorija dobije delete() komandu, ona ce ipak jos jednom da proveri celu pricu, za svaki slucaj. Ako ne moze da se obrise, baca exception. Ako moze, tek tada ce se pozvati originalna delete() metoda koja ce uraditi brisanje iz baze.

Zasto je ovo jos bitno;
recimo, program ima vise administratora. Postoji kategorija 'Automobili', ali nijedan proizvod u njoj. 2 admin-a su ulogovana, obojica posmatraju listu svih kategorija i obojica znaci imaju link za brisanje. Medjutim, admin 1 doda neki proizvod npr. 'Jugo'. Admin 2 i dalje ima link za brisanje jer nije osvezio stranicu. On klikne na nju; da nema gornje provere, kategorija 'Automobili' i proizvod 'Jugo' bi bili obrisani, zar ne?

Na gornjem primeru mozes i da vidis zasto je veoma bitno da ne saljes parametre; napisati unit test za ovo je 2 minuta posla. Ali ajde da prosirimo pricu jos malo; recimo da jednog dana uradis one-2-many izmedju Category i Image tj. ako kategorija ima neke slike, opet nece moci da se obrise. Cisto primer. Gornji kod bi se prepravio za 2 minuta:
Code:

    public function getImages()
    {
        return $this->Image ;
    }
    
    public function isDeletable()
    {
        return ( count($this->getProducts()) == 0  AND count($this->getImages())==0 ) ;
    }


a ti samo dodas jos jedan test za metodu isDeletable(). Konkretnije; u bootstrap ces imati jednu kategoriju totalno praznu, jednu kategoriju samo sa proizvodima, jednu sa slikama i jednu i sa slikama i sa proizvodima. Ako pretpostavimo da kategorija ciji je ID=4 ima i slike i proizvode, test bi bio nesto poput:
Code:

    public function test_isDeleteable_CategoryWithProductsAndImages()
    {
        $category = CategoryTable::getinstance()->find(4) ;
        $this->assertFalse($category->isDeletable()) ;
    }


Javi da li si razumeo sve ovo. Ako jesi, ocekujem 'ladno pivo
[ alfa-pro @ 17.11.2010. 13:03 ] @
Uh ti si bas odvojio vremena za mene kada si ovoliko ispisao dobrih informacija... Izvini sto tek sada odg. imam problema sa netom nesto rade majstori tako da bas ugrabim sada priliku od drugara da udjem... Prostudiracu ovo samo da sredim problem pa ti posaljem da vidis sta sam uradio....

Moze cela gajba nije problem :D
[ mitke013 @ 18.11.2010. 13:12 ] @
Citat:
alfa-pro: Uh ti si bas odvojio vremena za mene kada si ovoliko ispisao dobrih informacija... Izvini sto tek sada odg. imam problema sa netom nesto rade majstori tako da bas ugrabim sada priliku od drugara da udjem... Prostudiracu ovo samo da sredim problem pa ti posaljem da vidis sta sam uradio....

Moze cela gajba nije problem


Ma nije frka, trebalo mi 15 min. Znam kolikih sam ja imao problema sa OOP-om; klasa Dog extends Animal sam video 100 puta! I? To sam znao odavno, ali nisam video neku upotrebu u konkretnom slucaju. Tek kad sam presao na Doctrine sam mogao da se posvetim OOP-u. I tada sam imao naviku da saljem brdo parametara (lose stvari koje sam ucio ranije) ali uz unit testove sam se brzo oslobodio toga. Razlika je ogromna; kad budes nesto slao na analizu, obavezno uz kod posalji test za to.
Evo ti nova pravila: prouci Doctrine, makar samo baci pogled na DQL posto ne znas engleski. Ima brdo ORM-ova, drzi se najboljeg a i tu mogu da ti pomognem. Ostale stvari tipa dizajn batali na neko vreme ili koristi 960GS cisto da imas neki prikaz. Mada posto ucis OOP, prikaz ti nije uopste ni potreban.

Samo pre nego sto se na nesto ovako veliko odlucis, razmisli dobro da li time zelis da se profesionalno bavis ili samo kao hobi. Pare na programiranju je iznenadjujuce lako zaraditi (freelancing), ali ces morati da se ozbiljno posvetis tome. Znaci ako ti nesto predlozim, obavezno razmisli o tome, ne veruj na nevidjeno. Stekni tu naviku i brzo ces napredovati.

Sto se tice piva; kafic Forma ima jako lepo toceno pivo, nemoj misliti da sam se zezao oko toga
[ alfa-pro @ 19.11.2010. 14:32 ] @
Uh mitke ja sam bash ovo sto si mi napisao sve do sada procitao 100x.
Ovo je nesto novo za mene.
Citat:

Ajde ovako da probamo:
koliko ti je problem da naucis sta je Active-Record?

Ne znam sta je ovo ali sam izgooglao nesto i downloadovao
http://www.phpactiverecord.org/
ne znam da li sam pravu stvar nasao?
Preuzeo sam i http://www.doctrine-project.org/ iskreno receno daleko sam ja od doctrine ja sam sve to prevodio preko google translete i razumeo sam nesto koliko je preveo... Ne razumem sta je ORM? Ja sam naucio tacno clase i to sve kako ide ali ja eto pogledam taj doctrine to je bas za naprednije korisnike.

Jel ti se desavalo npr. ko meni sto se desava: Ja iskreno ne volim da koristim tudje stvari iako su dozvoljene tipa kao sto razni framewokovi i ovaj doctrine. Neznam nekako se bolje osecam kada ja napravim i kada znam da je to moje i da sam ja to napravio, a kada preuzem neki FW onda me to bocka u meni i izgubim volju....

Pazi mitke ne znam zahvalan sam ti mnogo sto si posvetio dosta vremena da mi pomognes...
Ja sam bas resio da se baviom ovim celog svog zivota, da zivim od ovoga jer to stvarno volim i zanima me strasno. Prvi susret sa dizajnom sam krenuo pre 4 god zavrsio sam IT Akademiju radio sam u Win-Win-u i puko sam zbog tog PHP-a. Evo godinu dana ce sada kako svaki dan bukvalno po 8h dnevno provedem uz njega ne znam navuko sam se na njega :)...

Ja mislim da bi trebali da opet startujemo iz pocetka... Vec sam rekao naucio sam teoriju presao sam sve ovo
http://www.php.net/manual/en/language.oop5.php

E sada mogao bi kao neko ko se mnogo ali mnogo vise razume da mi preporuci sta bi bilo sada najbolje da krenem da ucim da bi polako dosao do te granice da razumem doctrine. Bas je profesionalno uradjeno......

Code:
Ne, bas sam mislio na: Gledaj da bacas exception.

Ukapirao sam sta ti ovo znaci... Kada sam ucio php posle funkcija lekcije sam ucio OBRADA IZUZETAKA
Code:

try

  throw new Exception ('Ovde neki text', '42');
}
catch (Exception $greska)
{
  echo 'Exception' . $greska->getCode(). ':' . $greska->getMessage() . 'u fajlu' . $greska-> getFile(). 'na liniji' . $greska->getLine(). '<br>';
}   


E sada ovo je nesto totalno simple.

Npr za dajem primer za onu moju klasu DB po mom nekom razmisljanju ja bi trebao da napravim posebnu klasu ( classException.php npr.)
i onda u onoj mojoj klasi samo je nasledim

Code:

class mojaKlasa extends classException
{
}
.

Jel to to ili sam opet omasio sve?

Citat:
Evo dajem primer ja klasu za bazu bi nekako zbudzao i to bi radilo to razumem ali da me neko pita uradi klasu za logovanje i registraciju ili uradi kontroler klasu za MVC parent ne bi znao da beknem.

Bas sam nesto razmisljao oko ovoga za login...
Pazi napravio bi u LIB direktorijumu klasu korisnici koja ce da sadrzi metode najosnovnije samo za korisnike, a u controller direktorijumu bi naravno postavio klase tipa ako ocu login onda napravim login klasu nasledim klau korisnici... Sto si ti napomenuo po primeru Dog extends Animal, tako i ovo, naravno i registracija pripada klasi korisnici... I onda sve to izvezem u view delu samo sto ako vec radim sa korisnicima preporuceno je da se koristi baza onda bi trebao model da uradim ali ja jos uvek ne kapiram MVC model tako da necu jos da se previse opterecujem time nego cisto kazem ovako.

Napomenuo sam ti za unit testove... Ja sam sve to pogresno radio, to sto sam ja utripovao da je unit to nije ni U od unit testa...Ja sam nesto na googlu nasao gde je neki gori amater pametovao i ja po tome nesto radio i tek pre neki dan sam ukapirao da to nije to i bilo mi glupo da kazem... Nasao sam ovo
http://www.phpunit.de/
Celu noc sam se zezao oko instalacije procitao 100 tutora i nisam. Na kraju sam zavrsio na YT da nadjem neki video pa cu mozda da uspem tako. I nisam opet, mislim jesam na neki nacin skunuo sam ja PEAR i testirao kao sto je receno u jednom tutoru
Code:

<?
// This is a test page for PEAR Text_Highlighter package
$message = "Hello, world!";
 
echo $message;
?>
.
Ali ne znam sta dalje kako se to dalje koristi ova poruka znaci da sam uspesno instalirao.. Neznam pogledaj vidi ja se ovde raspisao pa vidi sta bi mogao da radim dalje? Stvarno doctrine ne mogu da razumem mnogo rano sam krenuo na to.. Trazio sam sta je ORM nisam nasao jbg...

Sto piva tice ja sam bas obozavaoc piva. Idem ponekad u formu jer imaju tamno toceno :) vecinom sam u Arhivu oni imaju Cesko Plzensko Toceno uXX :)
Naravno mozemo i ovako da se vidimo da se upoznamo ne mora da bude samo ako si mi pomogao da castim... Samo reci kada si slobodan
[ mitke013 @ 19.11.2010. 15:52 ] @
Citat:

Ne znam sta je ovo ali sam izgooglao nesto i downloadovao
http://www.phpactiverecord.org/
ne znam da li sam pravu stvar nasao?


Guess what? Promasio si Tebi treba ovo mada sam ti u prethodnoj poruci opisao sta je AR.

Citat:
Jel ti se desavalo npr. ko meni sto se desava: Ja iskreno ne volim da koristim tudje stvari iako su dozvoljene tipa kao sto razni framewokovi i ovaj doctrine. Neznam nekako se bolje osecam kada ja napravim i kada znam da je to moje i da sam ja to napravio, a kada preuzem neki FW onda me to bocka u meni i izgubim volju...

Jeste, dok se nisam dozvao pameti I ja sam filozofirao da 'umem ja to bolje'. Srecom, ta bolest me drzala par dana i izlecio sam se uspesno. Popi 2 andola, preznoj se, proci ce i tebe

Razmisljaj ovako:
1. kad zidas kucu jel sam pravis cekic, eksere, seces drva u sumi, rucno pravis cigle...? Ne? E pa isto ti je u programiranju. Imas gotove alate i budi SIGURAN da neces napraviti ne bolje, nego cak ni blizu nijednog od tih alata.
2. Dva klijenta me cekaju zato sto ne mogu da nadju freelancer-a koji zna doctrine, bar kao ja (napredne stvari tipa listeners, behaviours....)
3. Dobro sam placen (za ex-yu uslove) za to znanje; klijent je SAM podigao cenu sa 12 na $16/h. Pricali smo o 20-25 za naredni projekat; pritom ne zaboravi da sam kao osoba drkadzija, izvoljevam sve i svasta, imam totalno prazan CV (samo par slika i youtube video) i opet jedva zele da rade sa mnom opet.
4. Bio sam deo tima koji je pravio ORM; uzalud potrosenih 4-5 meseci na program koji blage veze nemam kako radi, a nema ni 5% mogucnosti Doctrine-a
5. Od kako ga koristim radim brze za NAJMANJE 10 puta. Nema SQL-a, radim kompleksne validacije u par linija koda, migraciju baze mi doctrine sam radi, DQL daleko citljiviji od SQL-a.... Veruj, ako ne budes koristio neki ORM, nikad se neces moci posvetiti OOP-u nego ce ti fokus stalno odlaziti na bazu. Znam, pricam iz iskustva.
6. Hoces primer? Pogledaj ovaj klip . Nije bas jednostavno kao Symfony (ili neki drugi FW), ali za 10 minuta, odlicno je. Pauziraj i pogledaj kako kod izgleda. Ne zaboravi; svuda je server-side validacija. Ako obratis vise paznje, videces da niujednom trenutku nisam ja menjao bazu vec program.

Citat:
E sada mogao bi kao neko ko se mnogo ali mnogo vise razume da mi preporuci sta bi bilo sada najbolje da krenem da ucim da bi polako dosao do te granice da razumem doctrine. Bas je profesionalno uradjeno......

Najlakse ti da instaliras Sandbox resenje; tu vec imas neki config fajl, samo izmenis ime baze i to je to. Ostatak ne diraj, bar za sada.

Citat:

class mojaKlasa extends classException
{
}

Jel to to ili sam opet omasio sve?


Bas te ne ide Mani se obrade izuzetaka, to ti nije ni NAJMANJE bitno za ucenje OOP-a. Poenta je da program STANE, a drugi put cu ti objasniti zasto exception a ne die funkcija.

Citat:
Pazi napravio bi u LIB direktorijumu klasu korisnici koja ce da sadrzi metode najosnovnije samo za korisnike, a u controller direktorijumu bi naravno postavio klase tipa ako ocu login onda napravim login klasu nasledim klau korisnici... Sto si ti napomenuo po primeru Dog extends Animal, tako i ovo, naravno i registracija pripada klasi korisnici... I onda sve to izvezem u view delu samo sto ako vec radim sa korisnicima preporuceno je da se koristi baza onda bi trebao model da uradim ali ja jos uvek ne kapiram MVC model tako da necu jos da se previse opterecujem time nego cisto kazem ovako.


Sa ovim vec pocinjes da pravis FW. Mani se, ne treba ti. Uradi idiot-proof User klasu sa sledecim metodama:
User::login($array) //
User::isLogged() ;
User::getLogged() ;
User::logout() ;

sve su staticke metode. Ona login($array) ; njoj bi poslao npr. $_POST tj. array('email'=>'nekiemail', 'password'=>'123123123' 'remember_me'=>1) // remember_me je opcioni

Tvoj kontroler bi znaci imao:
Code:

if ( User::login($_POST) )
  // idi dalje
else
  // prikazi opet formu

Dinamicke metode ces raditi kao ovo zavrsis. User::getLogged() mora da baci exception ako korisnik nije ulogovan; zato postoji prvo provera User::isLogged() ;

Citat:
Ja sam nesto na googlu nasao gde je neki gori amater pametovao i ja po tome nesto radio i tek pre neki dan sam ukapirao da to nije to i bilo mi glupo da kazem...

Rekoh ti ranije; ako si nesto procitao na netu, ne znaci da je automatski u pravu.
PHPUnit jeste malo nezgodan za instalaciju ako nisi radio sa PEAR-om ranije. Otvori novi topic za to, ne secam se bas kako ide.

Citat:
Ali ne znam sta dalje kako se to dalje koristi ova poruka znaci da sam uspesno instalirao.. Neznam pogledaj vidi ja se ovde raspisao pa vidi sta bi mogao da radim dalje? Stvarno doctrine ne mogu da razumem mnogo rano sam krenuo na to.. Trazio sam sta je ORM nisam nasao jbg...

PHPUnit nema nikakve veze sa ORM-om.
Sto se tice Doctrine-a; nije tezak, NIMALO! Cak sta vise, vrlo je jednostavan za nauciti. Ja sam bio kvazi-OOP programer pre Doctrine-a; 2-3 parametra po metodi, beskonacan kod koji niko ziv ne moze da procita pa ni ja posle nekog vremena, bez testova... Uzas! E onda sam odvojio nedelju dana za to; prva 2-3 dana sam samo citao dokumentaciju. Posle toga, krenuo sam da radim ali mi fokus sad bio na bitnim stvarima; nema vise SQL-a, ne jebavam se sa validacijom... Milina... Suma sumarum: recimo da ti mesec dana u VRH glave dovoljno da ga savladas.

Ako ces da izmisljas toplu vodu, samo napred. Vreme === novac , pa ti razmisli. I razmisli sta ce pre da te proda; znanje Doctrine-a ili znanje nekog tvog programa koji sigurno nece imati idiot-proof dokumentaciju niti ni blizu mogucnosti.

Zasto te teram da naucis Doctrine i Unit testove? Pazi; ne gubis vreme i fokus na sporedne stvari tipa baza. Kod je neverovatno kratak, kako u modelima, tako i u kontroloru. Ako imas one-2-many relaciju izmedju Category i Product, tebi ce print_r($category->toArray()) da ispise kako kolone kategorije, tako i pripadajuce proizvode. Moras da probas da bi me bolje razumeo. Doctrine sam ucitava relacije (lazy-load), ali ti mozes da napises svoj DQL kako bi bilo brze. Za pocetak, koristi lazy load ali samo baci pogled na DQL.

Testovi ce te 'naterati' da pises kratak kod u kontrolerima; pocetnika jednostavno 'vuce' da stavi logiku u kontroler umesto u model. Kad budes instalirao Phpunit, videces i sam.
Citat:
Sto piva tice ja sam bas obozavaoc piva. Idem ponekad u formu jer imaju tamno toceno vecinom sam u Arhivu oni imaju Cesko Plzensko Toceno uXX
Naravno mozemo i ovako da se vidimo da se upoznamo ne mora da bude samo ako si mi pomogao da castim... Samo reci kada si slobodan

Kad budem prvo video neki praktican napredak

Nisam li ti rekao da sam tezak?

A sad prouci ove moje postove vise puta. Nadji i ostale teme (kao sto je: OOP.. nesto nesto.. metode i broj parametara) gde sam ucestvovao. Citaj SAMO tamo gde ima primeri koda, ignorisi bilo kakvo teoretisanje i trolovanje zbog obima teme.
[ alfa-pro @ 19.11.2010. 16:37 ] @
Vazi hvala jos jednom proucicu ovo pa cu da se javim
[ mitke013 @ 22.12.2010. 14:54 ] @
Citat:
alfa-pro: Vazi hvala jos jednom proucicu ovo pa cu da se javim

Alfa covece, si ziv bre? Jel ti Doctrine napravio toliki problem da si se bacio u tugu i alkohol?
[ alfa-pro @ 08.02.2011. 21:57 ] @
Jaoj covek izvini ja sam tek sada video odgovor ovaj poslednji... Jaoj brate ne ide mi doctrine radim dosta sa Codeigniterom dobro mi ide radim neki manji blog cms gde vezbam Activ Record dobro sam ga savladao, sada sam nasao dodatak za CI koji je ORM i malo ulazim u fazon i sa time pa cu opet da pokusam Doktora. Neznam vuce me strasno taj doctrine skroz je nekako drugaciji valjda zato, citao sam dosta po dokumentaciji i vec polako stvari dolaze na svooje mesto sammo da se ja jos malo upoznam sa ORM-om i mogu da startujem......
Brata ceo kamijon tocenog, tamnog, svetlog, flasiranog ima da dobijes hehe
[ VladaSu @ 11.02.2011. 16:10 ] @
Vidim da ti niko nije odgovorio upotrebu klasa. Vise ide prica kako da koristis. Preglednost, citljivost itd su sporedne "nuspojave" objektnog programiranja.
Pa i nasledjivanje moze da bude prepisivanje metoda tj. nema pravog smisla ako ces to odraditi samo jednom.
Npr: ako imas klasu B koja nasledi klasu A a nemas klasu C koja isto nasledi klasu A onda se dovede u pitanje cemu nasledjivanje?

Na tvom primeru DB klase opet se postavi pitanje cemu klasa? Radi lepseg i citljivijeg koda? To bih onda nazvao "klasno programiranje".
Code:

define('DB_USERNAME', 'blabla');
...
function conect (db_un, db_pass)
....

Ako mozes da svedes DB klasu na ovaj kod onda sta si uradio? Bukvalno si translate procedure to OO i mozes dvosmetno da to radis.
"Pravi" OO kod ne mozes translate to procedure.

Objektno programiranje znaci da mozes da kreiras x objekata istovremeno koji ce se u zavisnosti od spoljasnjih uslova ponasati drugacije.

Npr pravis igricu gde imas 8 trkaca na 100 metara. Svakom zadas pocetne parametre: brzinu, ubrzanje, kilazu, varijacije tempa trcana, zavisnost od vremenskih uslova,
bioritam itd. Mozes da zadas x parametara svakom sprinteru. Kada trka pocne svaki sprinter ce se drugacije ponasati u zavisnosti od pocetnih parametara.
Ti te parametre mozes da menjas u realnom vremenu u zavisnosti od pocetnih i trenutnih spoljasnjih parametara.
Ovo znaci da ti imas 8 objekata.

Mozes da izvedes od klase Sprinter dve nove klase Men_Sprinter i Women_Sprinter gde ces imati jos koji razliciti parametar ili cak
mozes da uradis override neke funkcije jer ce recimo zene drugacije reagovati na hladnije vreme a muski drugacije na toplije vreme.
Ako imas samo jednog trkaca i gde je svejedno da li je musko ili zensko onda isto to mozes da napises u procedurama.

A ako ti je i sam stadion odnoso staza za trcanje neki objekat sa svojim parametrima onda objekti Sprinter mogu medjusobno da menjaju parametre jedni drugima.
Tipa Sprinter A utice negetivno na Sprintera B, Sprinter C losije trci ako u startu nije menju prva 3 Sprintera itd....
Staza moze da ima svoje parametri: nadmorsku visinu, vremensku zonu, vlaznost vazduha itd, sto opet moze da utice na Sprinter objekat.
Svaka staza ima svoje parametre, konstantne i promenljive i svaki sprinet ce se na svakoj stazi drugacije ponasati.

Onda Spriner moze da ime interface Covek gde su obavezna parametri kilaza, starost, pol itd. Taj interface moze/mora da ima i sudija i novinar i gledalac na tribinama.


Jos jedan primer:
tabela u js.
Svaka tabela je jedan objekat i mozes da imas vise tabela na strani.
Svaka tabela moze da ima x redova tj x Row objekata.
Svaka tabela moze da ima x kolona tj x Columns objekata.
Svaka tabela moze da ima x polja tj x Cell objekata.
Svaki row, cell i column moze drugacije da se ponasa na istoj strani. Da ima drugaciji tekst, naslov, tooltip, boju slova, sirinu, visinu itd.

Doctrine isto ima smisla da bude OOP.

Mislim da je to objektno programiranje, kada imas objekte a ne objekat.

Sto ne znaci da treba da koristis proceduralno programiranje ako ne mozes svoj objekat da upotrebis kao u ovim primerima.