You are on page 1of 35

Osnove izrade PHP aplikacija

Uvod u OO PHP
Izradio: Davor Cihlar
Uredili: Goran uri; Savjetovali: deosi
19/03/2012 2/35
Plan

to emo nauiti

Razrede

Metode

Instance

Vidljivost varijali i metoda

!onstante

"ristu# varijalama i metodama

$arone metode
19/03/2012 3/35
!to je OOP

%je&tno orijentirano #ro'ramiranje

(ain #ro'ramiranja &oji je orijentiran #rema


oje&tu )entitetu*+ nje'ovom #ona,anju i vezama

"rirodnije za ovje&a

"rolemi &od #roceduralno' #ro'ramiranja

%dvojenost #ona,anja od #odata&a

-tru&ture se &oriste za sadr.avanje #odata&a+ a


#rocedure za rad nad tim #odacima

/o' te odvojenosti iznimno je te,&o odr.avati i


'raditi veli&e sustave
19/03/2012 0/35
!to su razredi"

Razredi su o#is stru&ture oje&ta

%je&t je instanca )#rimjera&* razreda

(#r1 rije 2ovca2 je razred+ a #rava ovca je #rimjera& razreda


ovca

-tru&tura razreda

"odaci

Varijale i &onstante

-va&a instanca ima vlastite vrijednosti

#romjena varijale u jednoj instanci ne uzro&uje #romjenu


u dru'oj

"ona,anje

%#eracije se izvode nad instancom

Mo'u utjecati na #odat&e


19/03/2012 5/35
#rzi uvod u OOP $%&

(ajjednostavniji #rimjer u 34u i ilo5

typedef struct {
char ime[64], prezime[64];
int naRacunu;
} Kupac; // opisnik kupca

typedef struct {
int cijena;
} Artikl; // opisnik artikla

typedef struct {
Artikl artikli[128];
int nArtikala;
Kupac *kupac;
} Kosarica; // opisnik kosarice
19/03/2012 6/35
#rzi uvod u OOP $'&

!a&o i u 34u is#isali u&u#nu cijenu &o,arice7

"odaci su odvojeni od #ona,anja

int izracunajCijenuKosarice(
Kosarica *kosarica);
Kosarica a;
... // ispuna kosarice
printf("Cijena kosarice A: %d\n",
izracunajCijenuKosarice(&a));
19/03/2012 8/35
#rzi uvod u OOP $(&

-tru&ture #odata&a .elimo &oristiti na ,to


jednostavniji nain

Kosarica a, b; // instanciranje
... // ispuna koarica a i b
printf("Cijena kosarice A: %d\n",
a.ukupnaCijena());
printf("Cijena kosarice B: %d\n",
b.ukupnaCijena());

9o omo'uuju metode unutar same stru&ture


#odata&a
19/03/2012 :/35
#rzi uvod u OOP $)&

;odavanje metoda u 3<<5


class Kosarica {
public:
Artikl artikli[128];
int nArtikala;
Kupac *kupac;
int ukupnaCijena() {
int i = 0, sum = 0;
for (; i < nArtikala; ++i)
sum += artikli[i].cijena;
return sum;
}
};
typedef struct {
Artikl artikli[128];
int nArtikala;
Kupac *kupac;
} Kosarica;
19/03/2012 9/35
#rzi uvod u OOP $*&

Isti #rimjer u "="4u )de>inicije razreda*5


class Kupac {
var $ime, $prezime;
var $naRacunu;
}
class Kosarica {
var $artikli = array();
var $kupac;
function ukupnaCijena() {
$sum = 0;
foreach ($this->artikli as &$a)
$sum += $a->cijena;
return $sum;
}
function dodajArtikl($a) {
$this->artikli[] = $a;
}
}
19/03/2012 10/35
#rzi uvod u OOP $+&

Isti #rimjer u "="4u )&ori,tenje*5

$a = new Kosarica(); // instanciranje


$b = new Kosarica();
$a->dodajArtikl(...); // ispuna koarice
echo "Cijena kosarice A: ",
$a->ukupnaCijena(), "\n";
echo "Cijena kosarice B: ",
$b->ukupnaCijena(), "\n";
19/03/2012 11/35
#rzi uvod u OOP $,&

"ro,irimo malo razred Kupac5

class Kupac {
var $ime, $prezime;
var $naRacunu;
function plati($iznos) {
if ($this->naRacunu < $iznos)
return false;
$this->naRacunu -= $iznos;
return true;
}
}
19/03/2012 12/35
#rzi uvod u OOP $-&

"ro,irimo i razred Kosarica5

class Kosarica {
var $artikli = array();
var $kupac;
function ukupnaCijena() {
$sum = 0;
foreach ($this->artikli as &$a)
$sum += $a->cijena;
return $sum;
}
function dodajArtikl($a) { $this->artikli[] = $a; }
function prodaj() {
if ($this->kupac->plati($this->ukupnaCijena()))
echo "Kupac je sretno platio! :)\n";
else
echo "Kupac nema para! :(\n";
}
}
19/03/2012 13/35
.adatak $%& / na0avka1php

!o#irajte #rije o#isane razrede u naav&a1#?#

"o&u,ajte sami na#raviti razred Artikl


19/03/2012 10/35
.adatak $%& / nastavak

(a#o&on+ #o&u,ajmo ne,to na#raviti s tim razredima@

// stvorimo novu koaricu


$kosarica = new Kosarica();
// stvorimo dva nova artikla
$a1 = new Artikl(); $a2 = new Artikl();
$a1->cijena = 42; $a2->cijena = 4;
// dodamo artikle u koaricu
$kosarica->dodajArtikl($a1);
$kosarica->dodajArtikl($a2);
// pogledajmo dodane artikle
var_dump($kosarica->artikli);
19/03/2012 15/35
.adatak $%& / nastavak

"rodajmo &u#cu sadr.aj &o,arice

$kupac = new Kupac();


$kupac->naRacunu = 1337;
$kosarica->kupac = $kupac;
$kosarica->prodaj();
echo "Na racunu (1): ",
$kupac->naRacunu, "\n";
echo "Na racunu (2): ",
$kosarica->kupac->naRacunu, "\n";

!oju vrijednost na &raju ima &u#ac na raunu7

;a li je to is#ravna vrijednost7 /a,to7


19/03/2012 16/35
De2inicija razreda i instanciranje

;e>inicija5

class Razred {
}

-amo o#is razreda@

(e zauzima mjesto u memoriji

Razred je #otreno instancirati

Isti razred je mo'ue instancirati vi,e #uta

-ve instance su meAusono nezavisne

Instanciranje5

$instanca = new Razred();


19/03/2012 18/35
Operator clone

Instance razreda se #ret#ostavljeno ne


&o#iraju@

$a = new Razred();
$b = $a; // $b je referenca na $a!

-u#rotno ne'o s ostalim ti#ovima varijali@

%#eratorom clone na'la,ava se da je instancu


#otreno &o#irati )&lonirati*

!o#iranje nije re&urzivno@

$a = new Razred();
$b = clone $a;

Isto vrijedi i &od #oziva >un&cija ili metoda5

$a = new Artikl();
$kosarica->dodajArtikl(clone $a);
19/03/2012 1:/35
Pristup varija0laa i etodaa

"omou o#eratora ->

/a #ristu# varijalama iza -> ne dolazi zna& $

class Razred {
var $a;
}
$x = new Razred();
$x->a = 4;
var_dump($x);
19/03/2012 19/35
3idljivost

9ri ti#a vidljivosti )za varijale i metode*5

public B #odrazumijevano

var je sinonim za public

(e #re#orua se &ori,tenje@

private B #ristu# mo'u samo unutar razreda

protected B #ristu# mo'u unutar naslijeAeni?


razreda

"rimjer odreAivanja vidljivosti varijali5

class Razred {
var $a; // podrazumijeva se public
public $b;
private $c;
protected $d;
}
19/03/2012 20/35
Po4etna vrijednost varija0le

Mo'ue zadati #oetnu vrijednost varijale

Vrijednost se automats&i #ostavlja #ri instanciranju

(ije mo'ue instancirati ne&i razred &ao #oetnu


vrijednost

(ije mo'ue #ostaviti #ovratnu vrijednost >un&cije &ao


#oetnu vrijednost

"rimjer5

class Razred {
public $a = 42;
}
$x = new Razred();
$x->a = 4;
$y = new Razred();
var_dump($x); // a = 4
var_dump($y); // a = 42 (nepromijenjen)
19/03/2012 21/35
5aknadne varija0le

Varijale nije nu.no de>inirati

Cli je esto #o.eljno zo' #oetne vrijednosti

"re#orueno je de>inirati varijale

"rimjer5

class Razred {
}
$x = new Razred();
$x->a = 4;
var_dump($x);
19/03/2012 22/35
6onstante

Razredi mo'u imati i &onstante

!onstanta ne mo.e iti #olje ili instanca@

Is#red imena &onstante ne dolazi zna& $

"ristu# o#eratorom ::

Dnutar razreda &onstanti je mo'ue #ristu#iti i sa


self::imeKonstante

"rimjer5

class Razred {
const konstanta = 'vrijednost';
}
echo Razred::konstanta, "\n";
19/03/2012 23/35
7etode $%&

-inta&sa de>inicije metoda je ista &ao i za


de>iniciju >un&cija

Metode su unutar razreda

(e smije iti istoimeni? metoda@

(adjaavanje je mo'ue simulirati &ao i &od oini?


>un&cija

-va #ravila &ao i &od >un&cija su ista

Metode mo'u imati de>iniranu vidljivost

Is#red &ljune rijei function

"ret#ostavljena vidljivost je public

"ristu# o#eratorom ->

!ao i &od varijali


19/03/2012 20/35
7etode $'&

"rimjer5

class Razred {
public function javna() {
echo "Ovdje sam!\n";
}
private function privatna() {
echo "Ne dam se!\n";
}
}
$x = new Razred();
$x->javna();
$x->privatna(); // greska!
19/03/2012 25/35
8this $%&

"osena varijala &oja oznaava 2ovu2 instancu

Instanca nad &ojom se metoda #oziva

%mo'uuje &ori,tenje varijali instance

Eez Ft?is se de>iniraju lo&alne varijale

%mo'uuje #oziv metoda instance

Eez Ft?is se #ozivaju 'loalne funkcije


19/03/2012 26/35
8this $'&

"rimjer 15

class Razred {
private $priv;
private function brisi() {
$this->priv = 0; // varijabla instance
}
public function napraviNesto() {
$a = 42; // lokalna varijabla
$this->brisi(); // poziv na funkciju instance
gotov(); // poziv na globalnu funkciju
}
}
19/03/2012 28/35
8this $(&

"rimjer 25

class Razred {
private $priv = 42;
public function postavi($a) {
$this->priv = $a;
}
}
$x = new Razred();
$x->postavi(4);
$y = new Razred();
var_dump($x);
var_dump($y);
19/03/2012 2:/35
Pristup varija0laa preko etoda

9zv1 geteri i seteri

%mo'uuju izvoAenje ne&e a&cije #ri izmijeni varijale

Izmjena ne&e varijale mo.da tra.i izmjenu dru'i?

Mo'ue #romijeniti ti# ili sam #odata& #rije izmjene varijale

(#r1 'et/set3elsius+ 'et/set!elvin &oji &oriste samo jednu varijalu

%mo'uuju zaranu izmjene varijali

Varijala se de>inira &ao #rivate )ili #rotected*

Im#lementira se samo geter

"re#oruena #ra&sa

"rimjer5

public function getBoja() {


return '#' . $this->boja;
}
19/03/2012 29/35
9aro0ne $en:l1 a:ic& etode

"ostoji ne&oli&o rezervirani? metoda

!oriste dva zna&a G &ao #re>i&s

__construct B &onstru&tor

__destruct B destru&tor

__call B #ozvana #ri #ozivu na ne#ostojeu metodu

__callStatic B &ao __call+ samo za stati&e metode

__get+ __set+ __isset+ __unset B #ozvane #ri #ristu#u


na ne#ostojeu varijalu

__toString B #ozvana #ri #retvori instance u strin'

__clone B #ozvana #ri &o#iranju instance

111

?tt#5//HHH1#?#1net/manual/en/lan'ua'e1oo#51ma'ic1#?#
19/03/2012 30/35
6onstruktor

"oziva se #ri samom instanciranju

%mo'uuje 2inteli'entnu2 inicijalizaciju

Mo'ue instancirati razred i #ostaviti 'a &ao


inicijalnu vrijednost ne&e varijale

%mo'uuje #arametriranje #ri instanciranju

"arametri se nalaze unutar za'rada iza imena


razreda &oji se instancira o#eratorom new
19/03/2012 31/35
6onstruktor / prijer
class Razred {
private $a;
public function __construct($a) {
$this->a = $a;
echo "Konstruirana! ($a)\n";
}
}
$x = new Razred(42);
var_dump($x);
Konstruirana! (42)
object(Razred)#1 (1) {
["a":"Razred":private]=>
int(42)
}
19/03/2012 32/35
Pretvor0a instance u strin:

"omou arone >un&cije __toString

/a te&stualnu re#rezentaciju instance

"rimjer5

class Cijena {
private $iznos, $valuta = 'kn';
public function __construct($iznos)
{ $this->iznos = $iznos; }
public function __toString() {
return sprintf("%.4f$this->valuta",
$this->iznos);
}
}
$racun = new Cijena(42);
echo $racun, "\n";
19/03/2012 33/35
Stati4ke etode i varija0le

-tati&e metode i varijale su nevezane uz instancu

Mo'ue im #ristu#iti ez instanciranja

$this ne #ostoji unutar stati&i? metoda

"ristu#a im se o#eratorom ::

"rimjer5

class Razred {
static $staticna;
static function stvori() {
return new Razred();
}
}
$x = Razred::stvori();
var_dump($x);
var_dump(Razred::$staticna);
19/03/2012 30/35
.adatak $'& / kartas1php

;e>inirati dva razreda5 Karta i Spil

Karta

Mora imati metode5 getBoja+ getJacina i __toString

Eoja mo.e iti5 2Iir2+ 2/elje2+ 2-rce2+ 2Eundeva2

static $boja = array("ir", "Zelje", "Srce", "Bundeva");

Jaina mo.e iti5 282+ 2:2+ 292+ 2102+ 2;e&o2+ 2;ama2+ 2!ralj2+ 2Cs2

static $jacina = array("7", ..., "As");

Spil

u &onstru&toru is#uniti sa svim mo'uim &artama

"olje s &artama je #rivatna varijala

mora imati metode5

promijesaj B #romije,a &arte )&oristiti >un&ciju shuffle*

izvuciKartu B vraa #rvu &artu i ri,e ju iz #olja


19/03/2012 35/35
.adatak $'& / nastavak

"odijeliti 6 &arata sva&om od 0 i'raa

!oristiti 'loalnu >un&ciju )ne metodu@* &oja vraa


#olje sa setovima &arata

-va&i element #olja je set )#olje* &arata za sva&o'


#ojedino' i'raa

Rezultat #odjele jasno #ri&azati

!oristiti __toString za #ri&az &arata

You might also like