Anda di halaman 1dari 80

Tema PHP 3

Objekt-orijentisano programiranje
Obrada izuzetaka
Uzorci i funkcije sa znakovnim nizovima
dr Nebojša Bačanin Džakula
nbacanin@singidunum.ac.rs
Fakultet za informatiku i računarstvo, Univerzitet Singidunum
Veb platforme
2018/19
Korišćena notacija u nastavnim materijalima #1
▪ Radi lakšeg praćenja, materijali su u okviru svake teme (predavanja)
podeljeni na odgovarajuće sekcije (na primer 3), koje se dalje dele u
podsekcije (na primer 3.4).
▪ Ukoliko podsekcija obuhvata nekoliko slajdova, oni su redom numerisani
korišćenjem hashtag notacije (#1, #2,...,#n).
▪ Radi bolje čitljivosti koda, neke od naredbi su prikazane plavom bojom,
elementi uslovnih naredbi i petlji tamno crvenom bojom, oznake za
početak i kraj bloka naredbi narandžastom bojom, funkcije ljubičastom
bojom, dok se tekst koji se prikazuje kao rezultat izvršavanja programa
prikazuje svetlo zelenom bojom.

2
Korišćena notacija u nastavnim materijalima #2
▪ Pseudo-kod i sintaksa prikazani su u ovakvom okviru za tekst.

▪ Pokazni primeri PHP naredbi i funkcija dati su u ovakvom okviru


za tekst.
Hello.php

▪ Obzirom da je uz svaki pokazni kod koji, je prikazan u prezentacijama,


raspoloživ i odgovarajući PHP fajl, koji se nalazi na stranici predmeta, uz
svaki pokazni kod pridružen je „callout“ sa nazivom odgovarajućeg PHP
fajla.

3
Sadržaj predavanja
1. Višekratna upotreba koda
2. Objekt-orijentisano programiranje u PHP-u
3. Obrada izuzetaka
4. Uzorci i regularni izrazi
5. Funkcije sa znakovnim nizovima

4
1. Višekratna upotreba koda

5
1.1 Uvod #1
• U programiranju se često javlja potreba da se određeni kod upotrebljava i
izvršava više puta.
• Kako se jedan kod ne bi pišao više puta (svaki put za svaki program i više
puta unutar istog programa), koriste se potprogrami.
• Potprogrami su programi unutar programa.
• Program se deli na određene logičke celine, od kojih je svaka zadužena za
izvršavanje specifičnog zadatka.
• Ako u programu postoji potreba da se isti zadatak obavi više puta, ali na
različitim mestima, postoji razuman stav da se zadatak koji se ponavlja
definiše kao potprogram.
• Umesto da se naredbe za izvršavanje takvog zadatka pišu više puta na
različitim mestima u programu, ideja je da se one izdvoje u zasebnu
imenovanu celinu (potprogram) i da se po potrebi pozivaju samo
navođenjem imena potprograma i eventualnih ulaznih podataka.

6
1.1 Uvod #2
• Korišćenjem potprograma, program postaje čitljiviji, jer se program ne
posmatra kao niz naredbi, već kao niz konkretnih zadataka.
• Osim toga, potprogramima se postiže i ušteda, jer se omogućava da se isti
niz naredbi ponovo iskoristi na nekom drugom mestu u programu.
• Konačno, pisanje programa je lakše ako se program podeli na specifične
zadatke.
• U objekt-orijentisanim programskim jezicima, kakva je Java, često se
koristi termin „metod" umesto potprogram.
• U PHP programskom jeziku koristi se termin „funkcija“ umesto
potprogram.
• Postoje dve vrste potprograma:
➢ Procedure (eng. subroutines)
➢ Funkcije (eng. functions).

7
1.2 Funkcije include() i require()
• Pomoću funkcija require() i include() u PHP skript se može učitati
datoteka. Ta datoteka može da sadrži iskaze PHP-a, tekst, HTML oznake,
PHP-ove funkcije ili klase.
• Međutim, postoje razlike između ove dve funkcije.
• Funkcija require() ispisuje grešku (E_COMPILE_ERROR) i zaustavlja rad
skripta, ukoliko postoji problem.
• S druge strane, funkcija include() daje upozorenje (E_WARNING) i
skript će nastaviti dalje da se izvršava.

8
1.3 Funkcija include()
• Funkcijom include() se sadržaj jednog PHP fajla uključuje drugi.
• Funkcija include_once() uključuje fajl samo ako prethodno nije bio
uključen.
Include.php

$vozilo="automobil";
$marka="BMW";

Include1.php

// nema ispisa vrednosti promenljivih


// ali skript nastavlja sa izvrsavanjem
echo "Jedan $vozilo marke $marka";
echo "<br/>";
include (’Include.php’);
// ispisuju se vrednosti promenljivih
echo "Jedan $vozilo marke $marka";

• U navedenom primeru, sadržaja fajla „Include.php“ se uključuje u fajl


„Include1.php“ i zatim se varijable definisane u prvom fajlu prikazuju u
drugom.
9
1.4 Funkcija require()
• Funkcija require() ima istu namenu kao i funkcija include(), s tom
razlikom što se u slučaju funkcije require() izvršavanje PHP skripte
prekida, ako fajl koji se učitava ne može da se pronađe.
• Funkcija require_once()učitava fajl samo ako fajl prethodno nije
učitan.
Require.php

echo "ovaj tekst se ubacuje!";

Require1.php

echo "sledi tekst koji je ubacen <br/>";


require('Require.php');

10
1.5 Pojam funkcije #1
• Funkcija je grupa naredbi (iskaza) koje mogu da izvrše kao jedna jedinica.
• Funkcija je logička celina koja izvršava specifičan zadatak.
• Funkcije čine program preglednijim i lakšim za ažuriranjem.
• Funkcije eliminišu potrebu za pisanjem naredbi koje se više puta u istom,
ili različitim programima ponavljaju.
• Jedno od pravila dobrih programera: „Koristiti što više već jednom napisan
kod, umesto da se svaki put piše kod izpočetka“.

11
1.5 Pojam funkcije #2
• Kao i bilo koji drugi PHP kod, funkcije moraju da se definišu u okviru
<?php … ?> elementa
• Funkcija se sastoji iz deklaracije funkcije i njenog poziva.
• Deklaracija funkcije prikazana je ispod.

function imeFunkcije(parametri) {
naredbe;
}
• Skup naredbi u bloku naredbi {} nazivaju se telo funkcije.
• Kako bi se funkcija izvršila, najpre je potrebno da je pozovemo sa
određenog mesta u kodu programa.
• Funkcija se poziva njenim imenom i specifikacijom argumenata u okviru
zagrada.
• Vrednosti argumenata se prosleđuju odgovarajućim parametrima funkcije
u skladu sa deklaracijom funkcije.
12
1.5 Pojam funkcije #3
• U imenima PHP funkcija ne pravi se razlika između malih i velikih slova, na
primer izracunaj, Izracunaj i iZrAcUnAj je ista funkcija.
• Kao što je rečeno, funkcija se poziva njenim imenom, sa specifikacijom
njenih argumenata u zagradama. Tako na primer, funkcija:
deklaracija funkcije
function prikazi($nesto) { ime funkcije
echo $nesto;
} argument funkcije

• bi iz programskog koda bila pozvana kao prikazi(“Danas ucimo


PHP”).
• Kao što je rečeno, funkcija može da ima jedan ili više parametara, ali ne
moraju svi da budu obavezni.

13
1.5 Pojam funkcije #4
• Pravila za određivanje imena funkcije u PHP-u:
➢ Nova funkcija ne sme da ima isto ime kao postojeća funkcija,
➢ Ime funkcije može da se sastoji iz slova, cifara i donje crte (_),
➢ Ime funkcije ne može da počinje cifrom i
➢ PHP ne dozvoljava preklapanje ugrađenih funkcija.

14
1.5 Pojam funkcije #5
• Funkcija se može pozvati rekurzivno.
• Rekurzija u informatici i matematici označava funkciju ili postupak koji u
svojoj definiciji koriste sami sebe.
• Funkcija takođe može da se definiše uslovno, ili unutar druge funkcije i
onda će biti deklarisana samo ako je uslov ispunjen, tj. kada se ta druga
funkcija pozove.
• Opciono, u telu funkcije može da se koristi naredba return.
• Naredba return služi da bi se rezultat funkcije vratio pozvanoj naredbi.
• Naredba return dodeljuje pozvanoj naredbi vrednost određenog izraza.
• Tip može biti proizvoljan, na primer return 25, return „danas“,
return $x*$y.

15
1.6 Primeri funkcija #1
Funkcija.php
<?php

function moja_funkcija()
{
echo "Funkcija bez argumenata<br/>";
}

function moja_funkcija1($argument)
{
echo $argument;
}

// pozivamo funkciju bez argumenata


moja_funkcija();

$a="Danas ucimo PHP";

//pozivamo funkciju sa argumentima


moja_funkcija1($a);

?>
16
1.6 Primeri funkcija #2 Funkcija1.php

<?php

// primer funkcije koja kao argument prima niz


// argument moze da bude bilo sta
function napravi_tabelu($arg)
{
echo '<table border = 2>';
reset($arg); // pokazivac na pocetak niza
$vrednost = current($arg); // pokazivac na tekuci element niza
while ($vrednost) {
echo "<tr><td>$vrednost</td></tr>\n";
$vrednost = next($arg);
}
echo '</table>';
}

$niz = array('Veb','Programiranje','Singidunum');
napravi_tabelu($niz);

?>
17
1.6 Primeri funkcija #3
Funkcija2.php

<?php

//funkcija koja vraca kvadrat broja datog kao argument funkcije


function kvadrat($broj)
{
return $broj*$broj;
}
// stampa rezultat 16
echo kvadrat(4);

?>

18
1.7 Opseg važenja promenljivih
• Obzirom da je o opsegu važenja već bilo reči, ovde će samo ukratno biti
napomenuti ključni elementi.
• Opseg važenja promenljive određuje deo koda u kome je promenljiva
vidljiva i validna.
• Promenljive deklarisane unutar funkcije imaju opseg važenja od mesta
deklarisanja, do kraja funkcije. Za ove promenljive kaže se da imaju
lokalni, tj. funkcijski opseg važenja.
• Promenljive koje su deklarisane izvan funkcije imaju opseg važenja od
mesta deklarisanja, do koda (fajla). Za ove promenljive kaže se da imaju
globalni opseg važenja i nazivaju se globalne promenljive.
• Pomoću rezervisane reči global može ručno da se zada globalni opseg
važenja za promenljivu koja je definisana unutar funkcije.

19
1.8 Argumenti funkcije
• Argumenti funkcije su izrazi koji su razdvojeni zarezom
• Promenljiva, tj. argument funkcije (na primer $a) može biti prosleđena
direktno $a, ili preko reference &$a. U drugom slučaju može da se menja
vrednost argumenta (videti naredne slajdove).
• Argumentima može da se dodeli i default vrednost. Primer:
Funkcija3.php

<?php
//funkcija sa default vrednoscu argumenta
function moja_funkcija($pice="Kisela voda")
{
echo $pice , "<br/>";
}
//stampa se "Kisela voda"
moja_funkcija();
//stampa se “Espresso”
moja_funkcija("Espresso");
?>

20
1.9 Prosleđivanje parametara po vrednosti i po referenci #1

• Kod prosleđivanja parametara po vrednosti (eng. pass by value), unutar


funkcije se kreira nova promenljiva koja je kopija originala i koja sadrži
prosleđenu vrednost.
• U ovom slučaju kao argument funkcije navodi se promenljiva, na primer
$a.
• Kod prosleđivanja po vrednosti, vrednost prosleđene promenljive unutar
funkcije može slobodno da se menja, dok vrednost te promenljive van
funkcije ostaje nepromenjena.
• U slučaju prosleđivanja parametara po referenci (eng. pass by reference),
ne pravi se kopija prosleđene promenljive, već se preuzima referenca na
originalnu promenljivu.
• Referenca se ponaša kao promenljiva, upućuje na original i nema
sopstvenu vrednost (svaka izmena reference se odnosi i na original).
• U ovom slučaju kao argument funkcije navodi se promenljiva sa znakom
&, na primer &$a.
21
1.9 Prosleđivanje parametara po vrednosti i po referenci #2

<?php Funkcija4.php
// funkcija ima dva argumenta
// jedan prosledjen po vrednosti, a drugi po referenci

function uvecaj(&$a,$b)
{
$a++;
$b++;
}

$broj=0;
$broj1=0;
uvecaj($broj,$broj1);
//ispisuje 1,jer je $broj prosledjen po referenci
echo "Prvi argument je: $broj<br/>";
//ispisuje 0, jer je $broj1 prosledjen po vrednosti
echo "Drugi argument je: $broj1<br/>";
?>

22
1.10 Prekidanje izvršavanja funkcije
• Ključna reč return, o kojoj je bilo reči može da posluži za izlazak iz
funkcije, na primer ako neki uslov nije zadovoljen. Funkcija5.php
<?php
function veci($x, $y) {
if(!isset($x)||!isset($y)) {
echo 'Nisu dobro prosledjeni brojevi';
return;
}
if($x>=$y)
echo $x;
else
echo $y;
}
$a=25;
$b=30;
//ispisuje 30
veci($a,$b);
//izbacuje gresku i ispisuje "Nisu dobro prosledjeni brojevi"
veci($a);
23
?>
1.11 Primer sa rekurzijom
• Kao što je već i rečeno, rekurzivne funkcije su funkcije koje pozivaju samu
sebe.
• Prednosti korišćenja rekurzivnih funkcija su te što je kod kraći i što
generalno rekurzivne funkcije predstavljaju elegantnije rešenje.
• Nedostak korišćenja rekurzivnih funkcija je taj što je memorija
opterećenija.
<?php Funkcija6.php
function obrni($tekst)
{
if (strlen($tekst)>0)
obrni(substr($tekst, 1));
echo substr($tekst, 0, 1);
return;
}
//ispisuje obrnuto string "Hello"
obrni("Hello");
?>
24
1.12 Ugrađene PHP funkcije
• Postoji veliki broj funkcija koje su ili ugrađene po defoltu ili se uključuju
kroz ekstenzije i dodatne biblioteke u PHP.
• Kategorizacija funkcija i potrebne ekstenzije se mogu naći na veb strani
http://www.php.net/manual/en/funcref.php
• Spisak svih funkcija se mogu naći na veb strani:
http://www.php.net/manual/en/indexes.php

25
2. Objekt-orijentisano programiranje u PHP-u

26
2.1 Klase i objekti #1
• Klasa je osnovna jedinica programiranja u objekt-orijentisanim
programskim jezicima.
• Osnovni elementi klasa su:
➢ Atribute (osobine, svojstva, ili promenljive koje opisuju objekat)
➢ Metode (operacije, funkcije, ili radnje koje objekat može da izvršava)
➢ Mehanizme za kreiranje objekata na osnovu definicije (konstruktore)

• Definisanje klase dato je ispod.

class testKlasa {
[[deklaracijaOsobine1] osobina1;]
[[deklaracijaOsobine2] osobina2;
…]
[[deklaracijaMetode1] metoda1;]
[[deklaracijaMetode2] metoda2;
…]}

27
2.1 Klase i objekti #2
• Objekat je jedan primerak, pojava ili instanca klase.
• PHP podržava objekte kao strukturu podataka.
• Objekti se definišu pomoću funkcija.
• Za svaki objekat su vezane osobine (atributi) i metode.
• Osobine su promenljive kojima se dodaju određene vrednosti.
• Metode su funkcije u okviru objekata pomoću kojih mogu da se menjaju
njihove osobine.
• Objekat se definiše pomoću operatora new.

testObjekat=new testKlasa

28
2.2 Osnovni principi OOP
• Neki od osnovni principa objekt-orijentisanog programiranja su
polimorfizam i nasleđivanje.
• Polimorfizam: svaki objekat izvedene klase izvršava operaciju onako kako
je to definisano u njegovoj (izvedenoj) klasi.
• Nasleđivanje: jedna klasa + jedna, ili više podklasa.
• Nasleđivanje omogućava nadgradnju i proširenje postojećih klasa.
• Koncept nasleđivanja će detaljno biti opisan u nastavku.

29
2.3 Modifikatori pristupa atributa
• Modifikatori pristupa atributa (osobina) mogu da budu:
➢ public (javni) – vrednost atributa može direktno da se menja sa bilo kog mesta u kodu.
➢ private (privatni) – vrednost atributa može da se menja samo preko metode objekta.
➢ protected (zaštićeni) – atribut je nepoznat van objekta.
➢ final (konačni) – vrednost atributa ne može da se menja u klasama koje nasleđuju datu
klasu.

30
2.4 Modifikatori pristupa metoda
• Modifikatori pristupa metoda mogu da budu:
➢ public (javni) – metod može da se koristi van svoje klase pozivanjem metode instance.
➢ private (privatni) – rezultati metoda se koriste samo u okviru objekta.
➢ protected (zaštićeni) – rezultati metoda se koriste samo u okviru objekta ili nekog od
naslednika klase čiji je objekat definisan.
➢ abstract (apstraktni) – metoda je deklarisana samo u roditeljskoj klasi
➢ final (konačni) – ne može da se menja u klasama naslednicima

31
2.5 Rad sa atributima objekta
• Vrednost atributa (osobine) objekta (instance) neke klase može da se
dodeli promenljivoj na sledeći način:

promenljiva = testObjekat -> Atribut1;

• Vrednost atributa (osobine) objekta (instance) neke klase može da se


promeni, ili naknadno da se definiše ukoliko nije bila ranije definisana na
sledeći način:

testObjekat -> Atribut1 = vrednost;

32
2.6 Primer kreiranja objekta sa metodom #1
<?php
class Pravougaonik{
// definisanje atributa
public $strana1;
public $strana2;
Pravougaonik.php
// kreiranje konstruktora
function __construct($a,$b){
$this->strana1=$a;
$this->strana2=$b;
}
//metoda za izracunavanje obima
public function izracunajObim() {
return (($this->strana1 + $this->strana2)*2);
}
//metoda za izracunavanje povrsine
public function izracunajPovrsinu(){
return ($this->strana1*$this->strana2);
}
}

33
2.6 Primer kreiranja objekta sa metodom #2
// kreiranje instance klase Pravouganik
$primerPravougaonika=new Pravougaonik(20,20); Pravougaonik.php
echo "Povrsina je: ", $primerPravougaonika->izracunajPovrsinu();
echo "<br/>";

echo "Obim je: ", $primerPravougaonika->izracunajObim();


echo "<br/>";
?>

34
2.6 Primer kreiranja objekta sa metodom #3
• U kodu iz primera, tamno zelenom bojom označeni su elementi koda koji su
karakteristični za objekt-orijentisano programiranje.
• U navedenom primeru kreirana je klasa Pravougaonik sa dva atributa, koji su
redom $strana1 i $strana2.
• Korišćena je metoda konstruktor, koja omogućava definisanje atributa objekta
odmah pri njegovom kreiranju.
• U konstruktoru se koristi ključna reč $this, koja upućuje na tekući objekat, u
kodu iz primera znači „vrednost atributa strana1 objekta klase Pravougaonik,
postavi na vrednost promenljive $a koja se prosleđuje prilikom kreiranja objekta“.
// deklaracija konstruktora
function __construct($a,$b){
$this->strana1=$a; // obratiti paznju da se ne pise $strana1 vec samo strana1
$this->strana2=$b;
}

//konstruktor se poziva prilikom kreiranja instance klase (u ovom slučaju


$primerPravougaonika)
$primerPravougaonika=new Pravougaonik(20,20);

35
2.6 Primer kreiranja objekta sa metodom #4
• Klasa iz primera ima dve metode: izracunajObim() i izracunajPovrsinu().
• Ove metode nemaju argumente.
• Obe metode koriste modifikator pristupa public, što znači da su vidljive
van klase.
• Objekti (instance) se kreiraju van definicije klase.
$mojObjekat = new mojaKlasa();

• A, u datom primeru, to je:


$mojPravougaonik = new Pravougaonik();

• Prilikom poziva metode koristi se sledeća sintaksa:


$mojObjekat->mojaMetoda();

• A, u datom primeru, to je:


$primerPravougaonika->izracunajObim();

36
2.7 Još jedan primer kreiranja objekta
Osoba.php

<?php
class Osoba{
public $ime;
// metoda za postavljanje vrednosti u atribut ime
public function postaviIme($ime)
{
$this->ime=$ime;
}
public function prikaziIme()
{
return $this->ime;
}
}
$ja=new Osoba();
$ja->postaviIme("Joe Doe");
echo "Moje ime je: ", $ja->prikaziIme();
?>

37
2.8 Pozivanje konstanti
• Da bi se pozvala konstanta klase kojoj objekat pripada, objekat ne mora da
se instancira (ne treba da se kreira).
Konstante.php

<?php
class Konstanta{
const PI=3.14159;
}
echo "Vrednost konstante PI je: ", Konstanta::PI;
?>

38
2.9 Nasleđivanje #1
• Nasleđivanje (eng. inheritance) je jedno od osnovnih koncepata objekt-
orijentisanog programiranja.
• Nasleđivanje je definisanje novih klasa korišćenjem postojećih klasa.
• Kada jedna klasa nasleđuje drugu klasu, nova klasa (ona koja nasleđuje)
dobija sve atribute i metode klase koju nasleđuje.
• Klasa koja je nasleđena naziva se bazna klasa (klasa roditelj), dok se klasa
koja nasleđuje naziva izvedena klasa (klasa dete).
• U izvedenoj klasi mogu da se dodaju novi atributi i metode koje nisu bile
definisane u baznoj klasi, a takođe mogu da se redefinišu (eng. override)
metodi koji su već definisani u baznoj klasi.
• U literaturi se bazna klasa još naziva i natklasa, dok se izvedena klasa
naziva podklasa.

39
2.9 Nasleđivanje #2
• PHP podržava nasleđivanje u više nivoa (eng. multi-level inheritance), što
znači da klasa može da nasledi klasu koja je već nasledila neku drugu klasu
(primer je naveden ispod).
• Međutim, u PHP-u jedna klasa ne može da nasledi dve ili više klasa, već
samo jednu.
• Nasleđivanje se definiše pomoću rezervisane reči extends.
class A {
// neki kod
}

class B extends A {
// neki kod
}

class C extends B {
// neki kod
}

$someObj = new A(); // moze ovako


$someOtherObj = new B(); // moze ovako
$lastObj = new C(); // moze ovako
40
2.9 Nasleđivanje #3
• PHP podržava nasleđivanje u više nivoa (eng. multi-level inheritance), što
znači da klasa može da nasledi klasu koja je već nasledila neku drugu klasu
(primer je naveden ispod).
• Međutim, u PHP-u jedna klasa ne može da nasledi dve ili više klasa, već
samo jednu (nije podržano višestruko nasleđivanje).
• Nasleđivanje se definiše pomoću rezervisane reči extends.
• Novokreirana metoda u klasi dete može da ima isti naziv sa istim brojem
argumenata, kao i metoda u klasi roditelj i to se naziva redefinisanje (eng.
overriding) metoda.
• Metodu iz klase roditelj možemo da pozovemo iz klase dete korišćenjem
sledeće sintakse:
parent::metoda():

41
2.9 Nasleđivanje #4
<?php
class JednostavnaKlasa
{
public $promenljiva="ovo je vrednost iz roditeljske klase";
public function prikazi(){
Nasledjivanje.php
// prikazuje vrednost atributa promenljiva
echo $this->promenljiva;
}
}
// klasa ProsirenaKlasa nasledjuje klasu JednostavnaKlasa
class ProsirenaKlasa extends JednostavnaKlasa {
// ova klasa redefinise metodu prikazi() u roditeljskoj klasi
public function prikazi()
{
echo "pozivamo metodu iz roditeljske klase sa istim nazivom <br/>";
parent::prikazi();
}
}
// kreiramo objekat klase ProsirenaKlasa
$primer=new ProsirenaKlasa();
// pozivamo metodu prikazi() objekta $primer
$primer->prikazi();
?>
42
2.9 Nasleđivanje #5
<?php
class Vozilo{
public $boja;
public $tip;
}
class Automobil extends Vozilo{
public function __construct() {
Nasledjivanje1.php
$this->tip="automobil";
}
public function postaviBoju($boja){
$this->boja=$boja;
}
public function prikaziBoju(){
return $this->boja;
}
}
class Kamion extends Vozilo{
public function __construct() {
$this->tip="kamion";
}
public function prikaziTip() {
echo "Ovo je kamion";
}
}
$automobil=new Automobil();
$automobil->postaviBoju("teget");
echo "Boja automobila je: ", $automobil->prikaziBoju();
echo "<br/>";
$kamion=new Kamion();
$kamion->prikaziTip();
?>
43
2.10 Sprečivanje nasleđivanja
• Tokom pisanja koda, javiće se potreba da se spreči nasleđivanje.
• Sprečavanje nasleđivanja vrši se pomoću ključne reči final.
• Kada se ključna reč final stavi ispred deklaracije klase, klasa ne može biti
nasleđena.
• Kada se ključna reč final stavi ispred deklaracije metode, ova metoda ne
može da se redefiniše istoimenom metodom ni u jednoj potklasi koja
nasleđuje klasu kojoj metoda pripada.

final function metoda1(){


//naredbe
}
final calss mojaKlasa{
//atributi
//metode
}

44
2.11 Interfejsi #1
• Kao što je već i napomenuto, PHP jezik ne podržava višestruko
nasleđivanje, tj. jedna klasa ne može da nasledi više drugih klasa, već
samo jednu.
• Interfejsi se koriste da bi se zaobišao „problem“ nemogućnosti višestrukog
nasleđivanja.
• Interfejs deklariše određen broj metoda, koje moraju da budu realizovane
(implementirane) u svim klasama koje realizuje (implementira) taj
interfejs.

45
2.11 Interfejsi #2
• Deklarisanje interfejsa prikazan je ispod.
• Interfejs sadrži samo deklaracija metoda, bez njihove implementacije, tj.
bez tela metoda.
interface MojInterfejs{
function prikazi();
}

• Kaže se da klasa implementira interfejs.


• Klasa koja implementira interfejs „se obavezuje“ da implementira sve
metode koje su date u interfejsu.
• Za implementiranje koristi se rezervisana reč implements. Primer je dat
ispod.
class MojaKlasa implements MojInterfejs{
}

46
2.11 Interfejsi #3
<?php
interface Car {
public function setModel($name);
Interfejsi.php
public function getModel();
}
class myCar implements Car {
private $model;
// set metoda koja postavlja vrednost private atributu
public function setModel($name)
{
$this -> model = $name;
}
// get metoda koja prikazuje vrednost private atributa
public function getModel()
{
return $this -> model;
}
}
$car=new myCar();
$car->setModel("Volvo");
echo "Ja vozim ", $car->getModel();
?>
47
2.12 Statički atributi i metode #1
• Statički atributi i metode mogu da se pozivaju bez kreiranja objekta.
• Statički atributi i metode deklarišu se korišćenjem rezervisane reči
static.
• Deklarisanje statičke metode prikazano je ispod.
class mojaKlasa{
static function izbroj(){
};

• Poziv statičke metode prikazan je ispod.

mojaKlasa::izbroji();

48
2.12 Statički atributi i metode #2
<?php

Static.php
class Poseta{
private static $posetioci = 0;

function __construct(){
// pomocu naredbe self:: poziva se staticki atribut
self::$posetioci++;}

static function izbrojPosetioce(){


return self::$posetioci;}}

$posete = new Poseta();

echo Poseta::izbrojPosetioce()."<br />";

$posete2 = new Poseta();

echo Poseta::izbrojPosetioce()."<br />";

echo $posete -> izbrojPosetioce();

?>
49
3. Obrada izuzetaka

50
3.1 Koncept obrade izuzetaka
• Kod se izvršava unutar try bloka:
try{
// blok koda
}

• Izuzetak se izaziva unutar try bloka:


throw new Exception(‘poruka’,broj_greske);

• Za svaki try blok mora da sledi makar jedan catch blok.

catch (Exception $e){


// kod za obradu izuzetka
}

• Objekat koji se prosleđuje bloku catch (da bi ga blok presreo) jeste


objekat prosleđen iskazu throw, koji je generisao izuzetak.
51
3.2 Klasa Exception
• Konstruktor klase Exception prihvata 2 parametra, i to: tekst poruke o
grešci i broj greške.
• Neke od najčešće korišćenih funkcija klase Exception su:
➢ getCode() -vraća broj greške koji je bio prosleđen konstruktoru
➢ getMessage() -vraća tekst poruke koja je bila prosleđena konstruktoru
➢ getFile() -pozivajućem kodu vraća punu putanju datoteke u kojoj je generisan izuzetak
➢ getLine() -vraća broj reda koda u kome je generisan izuzetak
➢ getTrace() -vraća niz s podacima o stablu pozivanja koji omogućavaju utvrđivanje mesta
na kome je generisan izuzetak
➢ getTraceAsString () -vraća iste podatke kao getTrace(), formatirane kao znakovni podaci
➢ __toString() -omogućava da se iskazu echo direktno prosledi ceo sadržaj objekta
Exception, sa svim podacima koje daju navedene metode

52
3.3 Primeri izuzetaka #1
Izuzeci.php

<?php

try{

throw new Exception("NAS IZUZETAK",13);


}

catch(Exception $e){

echo 'Desio se izuzetak pod brojem: '. $e->getCode() . ' sa porukom: ' . $e-
>getMessage() . ' u fajlu: ' . $e->getFile() . ' u liniji koda: ' . $e->getLine() .
'<br/>';

?>

53
3.3 Primeri izuzetaka #2
Izuzeci2.php

<?php

function checkNum($number) {
if($number>5) {
throw new Exception("Broj mora da bude manji od ili jednak 5", 13);
}
return true;
}

checkNum(6);
?>

54
3.3 Primeri izuzetaka #3
Izuzeci3.php

<?php

function checkNum($number) {
if($number<=1) {
throw new Exception("Broj mora da bude veci od jedan");
}
return true;
}

try {
checkNum(2);

//Ako se desio izuzetak, tj. ako je broj <=1, kod ispod nece biti prikazan
echo 'Ako vidite ovu poruku, onda je broj manji ili jedan 1';
}

// hvatanje izuzetka
catch(Exception $e) {
echo 'Poruka:' .$e->getMessage();
}
?>
55
3.3 Primeri izuzetaka #4
Izuzeci4.php

<?php

class customException extends Exception {

public function errorMessage() {

//poruka o gresci
$errorMsg = 'Greska na liniji '.$this->getLine().' u fajlu'.$this->getFile()
.': <b>'.$this->getMessage().'</b>';
return $errorMsg;
}
}

function checkNum($number) {
if($number<=1) {
throw new customException("Broj mora da bude veci od jedan");
}
return true;
}

try {

checkNum(1);

echo 'Ako ovo vidimo, onda je dobro';

catch (customException $e) {


//prikazi poruku
echo $e->errorMessage();
} 56
?>
4. Uzorci i regularni izrazi

57
4.1 Pojam uzoraka i regularnih izraza
• Uzorak (eng. pattern) je niz znakova i specijalnih karaktera.
• Sintaksa:

imeUzorka = /mustra/atributi;

• Mustra je niz znakova i specijalnih karaktera, a atributi su znakovi koji


određuju način primene mustre.
• Uzorak se često naziva i regularni izraz (eng. regular expression - regex) i
predstavlja niz znakova koji opisuje druge nizove znakova (eng. string), u
skladu s određenim sintaksnim pravilima. Prvenstvena svrha regularnog
izraza je opisivanje uzorka za pretraživanje nizova znakova.
• Sintaksa mustri i način upotrebe detaljno su opisani na sledećoj URL
adresi:
http://php.net/manual/en/regexp.introduction.php
58
4.2. Vrste uzoraka
• Postoji dve vrste uzoraka
➢ POSIX
➢ PCRE – Perl Compatible Regular Expression

• Perl uzorci su najpopularniji, i isti su kao i kod JavaScript-a.

59
4.3 Operacije #1
• Većina formalizama pruža operacije alternacije, grupisanja i kvantifikacije
prilikom konstruisanja regularnog izraza.
• Alternacija. Uspravna crta razdvaja alternative. Na primer
"gray|grey" se može skratiti u istovetan izraz "gr(a|e)y", i pri tome
spariti gray ili grey.
• Grupisanje. Zagrade se koriste za definisanje područja delovanja
(engl. scope) i prednosti operatora. Na primer, "gray|grey" i "gr(a|e)y" su
različiti uzorci, ali oboje opisuju skup koji sadrži gray ili grey.
• Kvantifikacija. Kvantifikator nakon znaka ili skupa njih određuje učestalost
pojavljivanja izraza koji prethodi.

60
4.3 Operacije #2
• Najčešće korišćeni kvantifikatori su ?, *, i +:
➢ ? Upitnik označava da pojavljivanje prethodnog izraza nula puta ili jedanput. Na
primer, colou?r sparuje i "color" i "colour".
➢ * Zvezdica (engl. asterisk) označava pojavljivanje prethodnog izraza nula puta, jedanput
ili bilo koji veći broj puta. Na primer, "go*gle" sparuje ggle, gogle, google, gooogle, itd.
➢ + Znak plus označava pojavljivanje prethodnog izraza barem jednom. Na primer,
"go+gle" sparuje gogle, google, gooogle, itd. (ali ne i ggle).

61
4.4 Specijalni znaci u uzorcima #1
Karakter Značenje
Slovo ili broj Istu vrednost
\cx control-x
\t Tab znak
\n Nova linija
\v Vertikalni tab znak
\f Form feed (nova strana)
\r Carriage return (početak strane)
\xhh Heksadecimalni kod unicode znak

Tabela 1: Specijalni znaci u uzorcima

62
4.4 Specijalni znaci u uzorcima #2
Karakter Značenje
Bilo kog karaktera od onih koji su navedeni
[...]
između [ i ].
[^...] Bilo kog karaktera koji nije naveden između [ i ].
. Bilo kog karaktera osim nove linije
\w Bilo kog ASCII definisanog slova, cifre ili _.
\W Bilo kog karaktera koji nije \w.
\d Bilo koje ASCII definisane cifre
\D Bilo kog karaktera koji nije ASCII definisana cifra
\s Blanko znak
\S Nije blanko znak
63
Tabela 2: Specijalni znaci u uzorcima - nastavak
4.4 Specijalni znaci u uzorcima #3
Karakter Značenje
Ponavljanje prethodne grupe najmanje n puta, ali najviše m
{n,m}
puta.
{n,} Ponavljanje prethodne grupe n ili više puta.
{n} Ponavljanje prethodne grupe tačno n puta.
Ponavljanje prethodne grupe jednom ili nijednom. Isto dejstvo
?
kao i {0,1}.
Ponavljanje prethodne grupe jednom ili više puta. Isto dejstvo
+
kao i {1,}.
Ponavljanje prethodne grupe nijednom ili više puta. Isto dejstvo
*
kao i {0,}.
Alternative. Pojavljivanje dela izraza sa desne ili pojavljivanje
|
izraza sa leve strane.
Grupisanje simbola u jedan objekat nad kojim se mogu koristiti
(...)
oznake *, +, ?, |, itd.
^ Pretraga uzorka se obavlja na početku stringa
$ Pretraga uzorka se obavlja na kraju stringa 64
Tabela 3: Specijalni znaci u uzorcima - nastavak
4.5 Primeri uzorka #1
• /[abc]/ predstavlja jedno pojavljivanje simbola a ili jedno pojavljivanje
simbola b ili jedno pojavljivanje simbola c.
• /[^abc]/ predstavlja karakter koji nije simbol a ili b ili c.
• /\d\d\d\d\d/ Pomoću ovog uzorka se definiše broj koji se sastoji od 5
cifara
• /\d{2,4}/ Uzorak koji označava pojavljivanje 2, 3 ili 4 cifre
• /\w{3}\d?/ Uzorak koji označava pojavljivljavanje tačno tri znaka i
opciono jedne cifre, npr. string koji odgovara ovom uzorku je „abc8” ili
„qoq”.
• /\s+java\s+/ Uzorak koji označava string “ java " sa jednim ili više
prostora pre ili posle stringa
• /["]*/ Uzorak koji označava nula ili više pojavljivanje karaktera navoda

65
4.5 Primeri uzorka #2
• /ab|cd|ef/ Uzorak koji označava pojavljivanje ab ili pojavljivanje cd ili
pojavljivanje ef
• /\d{3}|[a-z]{4}/ Uzorak koji označava pojavljivanje tri cifre ili 4 mala
slova, npr “123” ili “abcd”
• /((ab|cd)+|ef)/ Uzorak koji označava pojavljivanje stringa „ef” ili
pojavljivanje jednom ili više puta stringa „ab” ili pojavljivanje jednom ili
više puta stringa „cd”, npr. “abab”, “ef”
• Kada tražimo neki od komandnih znakova onda koristimo \*, a kada
tražimo \’, onda koristimo \\\’

66
4.6 Atributi uzorka

Atribut Značenje

Izvršavanje case-insensitive
i
ispitivanja.
Izvršava globalno ispitivanje, znači
pronači će se sva pojavljivanja
g definisanog uzorka, a neće se
ispitivanje zaustaviti posle prvog
pronalaska uzorka.

m Rad sa više linija.

Tabela 4: Atributi uzorka


67
4.7 Funkcije za rad sa uzorcima
• preg_grep(imeUzorka,imeNiza) – daje niz sa svim elementima niza koji u
sebi sadrže uzorak
• preg_match(imeUzorka,imeStringa[,nizUzoraka]) – daje listu poduzoraka
datog uzorka u zadatom stringu koji se čuva u zadatom nizu
• preg_replace(imeUzorka,imeStringa,imeNiza) – zadati uzorak se
zamenjuje stringom u datom nizu stringova (ili nizu)
• preg_split(imeUzorka,imeStringa) – stvara niz delova teksta koji su
razdvojeni zadatim uzorkom

68
4.8 Primeri korisnik uzoraka
• DNS
"^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9_\-]
{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9_\-]{0,61}[a-zA-Z0-
9]))*$"
• E-mail
“^[a-zA-Z0-9_\.\+\-]+@([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9_\-]
{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9_\-]{0,61}[a-zA-Z0-
9]))*$”
• Datum u formatu: (dd mm yyyy, d/m/y, itd.).
"^([1-9]|0[1-9]|[12][0-9]|3[01])\D([1-9]|0[1-9]|1[012])\D(19[0-9][0-9]|20[0-
9][0-9])$"

69
4.9 Primer uzorka u PHP-u #1
Uzorci.php

<?php

$pattern = "/ca[kf]e/";
$text = "He was eating cake in the cafe.";
if(preg_match($pattern, $text)){
echo "Match found!";
} else{
echo "Match not found.";
}

?>

70
4.9 Primer uzorka u PHP-u #2
Uzorci2.php

<?php

$pattern = "/^N/";
$names = array("Nebojsa", "Nikolina", "Marko", "Mitar", "Petar", "Nadica");
$matches = preg_grep($pattern, $names);

// Loop through matches array and display matched names


foreach($matches as $match){
echo $match . "<br>";
}

?>

71
5. Funkcije sa znakovnim nizovima

72
5.1 Funkcije za upoređivanje i manipulaciju Stringova
• U PHP jeziku su ugrađene brojne funkcije za rad sa znakovnim nizovima
(String).
• strlen(string) – dužina stringa
• strspn(string1,string2) – daje dužinu segmenta u kome se nalaze samo
znaci iz drugog stringa
• strtolower(string) – sva slova se menjaju u mala
• strtoupper(string) – sva slova se menjaju u velika
• ucfirst(string) – prvo slovo se menja u veliko

73
5.2 Funkcije za dodavanje i oduzimanje Stringova
• ltrim(string1,string2) – oduzimaju se znaci sa leva prvog stringa koji
pripadaju drugom stringu
• rtrim(string1,string2) – oduzimaju se znaci sa desna prvog stringa koji
pripadaju drugom stringu
• trim(string1,string2) – oduzimaju se znaci s krajeva prvog stringa koji
pripadaju drugom stringu
• str_pad(string1,duzina,string2[,tip]) – dodaje se drugi string prvom
stringu dok se ne dopuni do dužine, tip može biti STR_PAD_LEFT,
STR_PAD_RIGHT, STR_PAD_BOTH

74
5.3 Ostale korisne funkcije sa Stringovima
• explode(separator,string) – daje niz delova stringa koji su razgraničeni
znakom koji je separator
• implode (separator,niz) – obrnuto od explode
• strpos(string,podstring) – nalazi prvu poziciju podstringa u stringu
• strrpos(string,podstring) – nalazi poslednju poziciju podstringa u stringu
• substr_count(string,podstring) - broji broj nepreklapajućih podstringova u
stringu

75
5.4 Primeri funkcija sa Stringovima u PHP-u
Stringovi.php

<?php

$str = "Hello world. It's a beautiful day.";


print_r (explode(" ",$str));

$str = "Hello World!";


echo $str . "<br/>";
echo "<br/>";
echo rtrim($str,"World!");
echo "<br/>";
echo strtoupper("Hello WORLD!");
echo "<br/>";
echo strtolower("HELLO WORLD!");

?>

76
PITANJA?

77
Korišćena literatura

78
VAŽNO!
Ova prezentacija je nekomercijalna.
Slajdovi mogu da sadrže materijale preuzete sa Interneta, stručne i naučne
građe, koji su zaštićeni Zakonom o autorskim i srodnim pravima. Ova
prezentacija se može koristiti samo privremeno tokom usmenog izlaganja
nastavnika u cilju informisanja i upućivanja studenata na dalji stručni,
istraživački i naučni rad i u druge svrhe se ne sme koristiti –
Član 44 - Dozvoljeno je bez dozvole autora i bez plaćanja autorske naknade za nekomercijalne svrhe nastave:
(1) javno izvođenje ili predstavljanje objavljenih dela u obliku neposrednog poučavanja na nastavi;
- ZAKON O AUTORSKOM I SRODNIM PRAVIMA ("Sl. glasnik RS", br. 104/2009 i 99/2011)
.................................................................................................................................................................................
Nebojša Bačanin Džakula
nbacanin@singidunum.ac.rs

79
Tema PHP 3
Objekt-orijentisano programiranje
Obrada izuzetaka
Uzorci i funkcije sa znakovnim nizovima
HVALA NA PAŽNJI
dr Nebojša Bačanin Džakula
nbacanin@singidunum.ac.rs
Fakultet za informatiku i računarstvo, Univerzitet Singidunum
Veb platforme
2018/19