PHP (engl.Hypertext Preprocessor) specijalizovani je skriptni jezik prvenstveno namenjen za izradu dinamičnog veb sadržaja i izvodi se na strani servera.
PHP je stekao popularnost zbog svoje jednostavnosti i sintakse nasleđene iz programskog jezika C. Tokom vremena jezik se proširivao i sticao mogućnosti za objektno orijentisano programiranje, naročito od verzije 5.0. Nalikuje jeziku C++ u smislu što dozvoljava i čisto-proceduralno programiranje, ali istovremeno omogućava i korišćenje klasa i drugih koncepata objektno orijentisanog programiranja (nasleđivanje, apstraktne klase i metode, interfejse itd.).
PHP predstavlja naslednika alata po nazivu PHP/FI, napisanog 1994. godine od strane Rasmusa Lerdorfa.[3] PHP/FI je predstavljao skup alata napisanih u Perlu, i autor ga je koristio za sopstvene potrebe. Skup alata je dobio ime "alati za ličnu prezentaciju" (engl.Personal Home Page Tools), odakle i skraćenica PHP. Kako su rasle potrebe na sajtu, autor je prepisao kompletan projekat u C-u i omogućio da može da komunicira sa bazama podataka a korisnicima svog sajta da naprave sopstvene prezentacije pomoću njega. Rasmus je potom objavio[4] svoje alate i učinio izvorni kod dostupan svima da bi se projekat brže razvijao i da bi se greške (bagovi) brže ispravljale.
PHP/FI, čija je puna definicija glasila „alati za ličnu prezentaciju/prevodilac obrazaca“ (engl.Personal Home Page Tools/Forms Interpreter) je imao samo neke stvari zajedničke sa današnjim PHP-om — promenljive kao u Perlu, automatsko raščlanjivanje promenljivih iz zahteva i ugrađeni HTML. PHP/FI 2.0 je konačno i zvanično objavljen 1997. godine, da bi ga ubrzo zamenio PHP 3.0.
PHP 3.0 je predstavljao prvu verziju koja dosta liči na današnje verzije PHP-a. Kreirali su ga izraelski programeriZeev Suraski i Endi Gutmans sa fakulteta Tehnikon, kao potpunu preradu projekta PHP/FI. Otkrili su da je on imao ozbiljne nedostatke i da nije mogao zadovoljiti njihov univerzitetski projekat elektronske trgovine. U saradnji sa Ledorfom su objavili PHP 3.0 kao zvaničnog naslednika jezika PHP/FI, a njegov razvoj je zaustavljen.
Glavna osobina nove verzije jezika je bila njegova proširivost, koja je privukla brojne programere širom sveta da dodaju nove mogućnosti. Pored kvalitetne podrške za razne vrste baza podataka, verzija 3.0 je uvela i mogućnost objektno orijentisanog programiranja i veću konzistentnost u jezičkoj sintaksi.
Ime je promenjeno u PHP (bez dodatka "FI"), čije se značenje izmenilo da predstavlja rekurzivniakronim "PHP: preprocesorhiperteksta" (PHP: Hypertext Preprocessor).
PHP 3.0 je zvanično objavljen u junu 1998. nakon devet meseci korišćenja u probnoj fazi.
U zimu 1998. Zeev i Gutmans su započeli ponovno pisanje PHP-a ispočetka, pokušavajući da poprave jezgro tako da bi bolje radilo sa većim aplikacijama i da bi poboljšali modularnost. Novo jezgro su nazvali Zend mašina (Zend engine), po delovima svojih imena Zeev i Endi, da bi kasnije formirali i Zend Technologies u Ramat Ganu, Izrael, koja nadgleda unapređenje PHP-a. Novo jezgro je uspešno dovršeno i pojavilo se u javnosti sredinom 1999, a nova verzija PHP-a, 4.0, opremljena novim jezgrom je zvanično objavljena u maju, 2000. Pored boljih performansi, nova verzija je uključivala i keširanje standardnog izlaza, sesije, bolju podršku za različite veb-servere, sigurniji prenos korisničkih podataka i nekoliko novih kontrolnih struktura.
Verzija 5.0 je izašla u julu 2004. godine, nakon dugog razvoja i nekoliko probnih verzija. Koristi jezgro Zend mašina 2.0 sa novim objektnim modelom i mnogo novih mogućnosti.
Iako se PHP može koristiti za programiranje konzolnih aplikacija i grafičkih interfejsa (biblioteka PHP-GTK), njegova osnovna i glavna upotreba je u programiranju dinamičnih stranica na Internetu.
Do 1997. PHP je stekao nekoliko hiljada korisnika[3]; do 1998. broj sajtova na kojima je instaliran PHP 3.0 je porastao na par stotina hiljada a broj korisnika istog na par desetina hiljada[3]. Danas PHP koristi nekoliko stotina hiljada programera i nekoliko miliona sajtova[5] uključujući neke od najposećenijih sajtova na svetu, poput Fejsbuka, Vikipedije, Jahua, Jutuba i Flickra.
Program koji se napiše u PHP-u ne zahteva prevođenje (kompajliranje), nego se interpretira pri svakom izvršavanju. PHP interpretator može raditi po PHP CGI principu, odnosno tako što će interpretator postojati kao eksterna aplikacija, koja se poziva da izvrši datu skriptu svaki put kad bude zahtevana od nekog korisnika, a može biti instaliran i kao modul veb-servisa. Druga varijanta je danas u najvećoj upotrebi jer pruža znatno veću brzinu izvršavanja — interpretator je na taj način uvek učitan u memoriju te se ne mora pozivati spoljašnji program.
Uobičajen scenario po kom se izvršavaju PHP skripte je sledeći:
klijent (korisnik Interneta koji koristi neki internet pregledač) zahteva PHP stranicu sa servera
server prosleđuje zahtev servisu za veb (program veb-server na serveru)
veb-server prepoznaje da se traži PHP datoteka
ne šalje njegov sadržaj klijentu, nego ga izvršava kao program pomoću PHP modula
izlazni tekst programa (standardni izlaz) se šalje klijentu kao rezultat zahteva
klijent prepoznaje vrstu rezultata (HTML kod, slika, PDF sadržaj, arhiva itd.)
rezultat se prikazuje klijentu na odgovarajući način
Za razliku od većine programskih jezika koji poseduju početnu funkciju (main u C-u, prvi blok BEGIN i Paskalu, klasa sa main metodom u Javi itd.), PHP datoteka, nalik na većinu skriptnih jezika, jednostavno sadrži skup naredbi, koje se izvršavaju jedna za drugom, od prve do poslednje, gde se poslednja ujedno smatra i krajem PHP programa.
Struktura PHP skripta
PHP datoteke mogu da sadrže sledeće vrste elemenata[6]:
Postoje četiri stila za ispisivanje PHP oznaka[6]:
XML stil uz pomoć već pomenutih oznaka <?php i ?> i takav stil se preporučuje, a obavezan je kada je PHP kod usađen u HTML kod. U specijalnom slučaju dozvoljava se da poslednja oznaka ?> u zadnjoj PHP skripti ne bude navedena.
skraćeni stil između oznaka <? i ?>. Može da se koristi u koliko se u konfiguracijskoj datoteci php.ini aktivirana opcija short_open_tag, ali se njegova upotreba ne preporučuje zato što u nekim okruženjima nije podržan. Međutim, od verzije 5.4, skraćeni stil u obliku <?= ... ?> je omogućen bez obzira na podešavanja unutar konfiguracijske datoteke, a služi kao zamena za <?php ... ?>.[7]
skript stil između oznaka <script language="php"> i </script>, je duža verzija XML stila i obično se preporučuje kada se istovremeno koriste i drugi skriptni jezici, posebno ako HTML editor pravi probleme.
ASP stil između oznaka <% i %> predstavlja još jednu skraćenu verziju. Najčešće se koristi u ASP i ASP.NET okruženju, ali je neophodno prethodno aktivirati opciju short_open_tag u konfiguracijskoj datoteci php.ini. Takođe se ne preporučuje.
Pod belinama ili belim prostorima (engl.white spaces) se podrazumevaju znakovi za razdvajanje, kao što su oznake za povratak na početak reda, razmaci i tabulatori. Interpretatori za HTML kod i PHP izvorno okruženje zanemaruju ove prostore.
PHP naredbe „ugnježđavaju“ se u zaglavlje (engl.header) i/ili telo (engl.body) veb strane na sledeći način[8]:
<?phpPHPнаредбе?>
Ukoliko neka strana sadrži PHP skriptu, trebalo bi da nosi nastavak .php, kako bi veb server bio obavešten o njihovom postojanju.[8]
U PHP datoteci, blok koji je okružen jezičkim strukturama, koje započinju HTML oznakom (engl.tag) <?php, a završavaju se oznakom ?>, se smatra PHP kodom i izvršava se pomoću PHP interpretatora (tumača), dok se ostatak koda — van ovih oznaka — smatra hipertekstom, koji jednostavno treba da se ispiše na standardni izlaz, bez interpretiranja. Sledi primer jednog PHP programa:
<!-- наредни део написан у HTML-у се преписује директно на стандардни излаз --><html><body><p><!-- наредни део припада PHP блоку, те се извршава --><?php echo "Здраво свете!"; ?><!-- наредни део до краја кода се такође преписује директно на стандардни излаз --></p></body></html>
Tumač za PHP kod potpuno ignoriše prazan prostor između naredbi, tako da njegova upotreba zavisi od ličnog izbora programera i samo doprinosi vizuelnoj preglednosti ispisanog koda. Kraj svake naredbe obeležava se tačkom sa zapetom. Na ovaj način, prethodni primer će na standardnom izlazu prikazati sledeći tekst:
<!-- наредни део написан у HTML-у се преписује директно на стандардни излаз --><html><body><p><!-- наредни део припада PHP блоку, те се извршава -->Здравосвете!<!-- наредни део до краја кода се такође преписује директно на стандардни излаз --></p></body></html>
PHP kod može biti organizovan u funkcije i klase, i može se organizovati u više datoteka. Kao početna datoteka, tj. datoteka čije naredbe se izvršavaju prve, se uzima ona datoteka koja se da interpretatoru na izvršavanje. Ukoliko datoteka nije navedena, server će automatski pokušati da pokrene datoteku index.php.
Komentari se mogu pisati iza dve kose crte // ili simbola # ako su jednoredni (nalaze se u istom redu), ili između simbola /* i */ za jednoredne i višeredne komentare.
<?phpecho”Пробазаједноредникоментар”;// Ово је једноредни коментар/* Ово је коментар исписан у два реда */echo”Јошједанједноредникоментар”;# Ово је једноредни коментар?>
Promenljive (engl.variables) u PHP jeziku se predstavljaju pomoću znaka $, iza koga sledi ime promenljive. Ime mora da počne slovom ili donjom crtom _ iza kojeg može da sledi neograničen broj slova, brojeva ili donjih crta, pri čemu se slovom smatra slovo latinice [A-Z], [a-z] ili bilo koji znak sa ASCII kodom većim od 127. Tumač za PHP razlikuje velika od malih slova, pa tako promenljiva $А nije isto što i promenljiva $а.[9]
Promenljive se ne deklarišu, a njihov tip se određuje prema vrednostima koje im se u izrazima dodeljuju tokom programa, te postoji mogućnost da se tip promenljive promeni.
resource — resurs, sadrži upućivač na spoljašnji resurs, npr. datoteku ili veza sa bazom podataka
NULL — promenljiva nema vrednost, može sadržati samo vrednost null
Nije neophodna dodela početnih vrednosti, mada se preporučuje, radi preglednosti, bezbednosti i boljeg razumevanja koda, s obzirom da se njihovom primenom u izrazima koji sadrže mešovite tipove podataka, mogu dobiti različiti rezultati. Tako npr:
<?php$a=1.2;$b=2;$b=$a+$b;?>
promenljiva $b u početku je ceo broj, a zatim se pretvara u realan broj sa jednom decimalom (3.2). Osim dodeljivanja vrednosti implicitno, promena tipa promenljive se može izvršiti eksplicitnom konverzijom, tako što se ispred imena upiše tip promenljive, između zagrada. Primer:
<?php$a=1.2;$b=2;$b=(int)$a+$b;?>
U ovom slučaju promenljiva $b dobija vrednost 3. Pri tome se kod promenljive $а neće promeniti ni tip, ni vrednost.
Obe su jezički konstruktori, pa se pri njihovom pozivanju ne moraju koristiti zagrade. Razlika između jedne i druge funkcije je u tome što funkciji print može da se prosledi samo jedan argument, dok echo može da štampa više njih odjednom, tako da što pri pozivu promenljive stoje međusobno razdvojene zapetom. Promenljive svih tipova biće pretvorene u tip string prilikom ispisivanja.
Za ispitivanje da li je neka promenljiva prazna, odnosno da li ima dodeljenu vrednost, koristi se funkcija empty.[13]
Za ispitivanje da li neka promenljiva ima početnu vrednost, odnosno da njena vrednost nije null, koristi se funkcija isset. Ako se funkcija prosledi više od jedne promenljive, vraća vrednost tačno samo u slučaju da ni jedna od promenljivih prazna. Ispitivanje promenljivih izvršava se sleva nadesno i završava se u slučaju da naiđe na prvu promenljivu koja je prazna, jer u tom slučaju vraća vrednost netačno.[14]
Eliminisanje promenljive vrši se pomoću funkcije unset. Ponašanje ove funkcije u velikoj meri zavisi od vrste promenljive i mesta odakle je pozvana. Npr. u koliko se pozove unutar bloka neke korisničke funkcije, biće eliminisana vrednost samo lokalne promenljive. Za promene vrednosti globalnih promenljivih preporučuje se upotreba niza $GLOBALS[15]
Za strukturno prikazivanje na izlazu tipa i vrednosti promenljive, koristi se funkcija var_dump.[16] Funkcija je posebno korisna u toku razvoja programa.[17] Primer:
<?php$b=3.55;$c=true;var_dump($b,$c);// на излазу ће приказати: float(3.55) bool(true)?>
Za razliku od promenljivih, konstante se pišu bez simbola $. Pravilo za imena konstanti je isto kao i za promenljive. Mada nije neophodno, konstante se obično pišu velikim slovima, a njihove vrednosti se dodeljuju na sledeći način:
Jednom definisana konstanta, ne može da menja vrednost. Konstantama je moguće dodeliti isključivo skalarne vrednosti, već pomenutih osnovnih tipova podataka (boolean, integer, float i string). Primer:
<?phpdefine("KONST_BAZA_PODATAKA","mysql");echoKONST_BAZA_PODATAKA;// prikazuje "mysql"?>
Ovaj način definisanja može da se koristi na globalnom nivou, ali ne i u okviru blokova struktura, pojedinačnih funkcija, metoda ili klasa, pa se u tim slučajevima koristi ključna rečconst.
<?phpdefine(”MIN_VREDNOST”,"0.0");// Правилно дефинисање константе ван класеdefine(”MAX_VREDNOST”,"1.0");// Правилно дефинисање константе ван класе//const MIN_VREDNOST = 0.0; Неправилно дефинисање константе ван класе//const MAX_VREDNOST = 1.0; Неправилно дефинисање константе ван класеclassClasaKonstanta{//define(”MIN_VREDNOST”, ”0.0”); Неправилно дефинисање константе у оквиру класе није дозвољен//define(”MAX_VREDNOST”, ”0.0”); Неправилно дефинисање константе у оквиру класе није дозвољенconstMIN_VREDNOST=0.0;// Правилан начин за дефинисање константе унутар класеconstMAX_VREDNOST=1.0;// Правилан начин за дефинисање константе унутар класеpublicstaticfunctiongetMinVrednost(){returnself::MIN_VREDNOST;}publicstaticfunctiongetMaxVrednost(){returnself::MAX_VREDNOST;}}?>
Za dobijanje vrednosti određene konstante koristi se funkcija constan(), kojoj se prosleđuje ime konstante, a kao rezultat vraća vrednost konstante ili null ako konstanta nije definisana.[18]
Za dobijanje vrednosti svih definisanih konstanti može se koristiti funkcija get_defined_constants.[19] U PHP jeziku postoji veliki broj već predefinisanih konstanti[20], koje mogu slobodno da se koriste u bilo kom delu programa.
operator za pridruživanje znakovnih promenljivih je tačka (npr. ako je $A = ”jedem” , $B = " " i $C = "sarmu", kao rezultat operacije $A . $B . $C dobija se tekst ”jedem sarmu”)
operator dodele (=) i kombinovani operatori dodele
Kombinovani operatori dodele
operator
upotreba
značenje
++
$a++
$a = $a + 1
--
$a--
$a = $a — 1
+=
$a += $b
$a = $a + $b
-=
$a -= $b
$a = $a — $b
*=
$a *= $b
$a = $a * $b
/=
$a /= $b
$a = $a / $b
%=
$a %= b
$a = $a % $b
.=
$a .= b
$a = $a . $b
Operatori uvećanja (++), i umanjenja (--) u izrazima se mogu primeniti prefiksno ili sufiksno . U zavisnosti od položaja operatora u odnosu na promenljivu, mogu se dobiti različiti rezultati. Npr.
$x = ++$a; — prvo uvećava promenljivu $а za 1: $a = $a + 1;, a zatim dodeljuje njenu vrednost promenljivu $x: $x = $a;
$x = $a++; — prvo dodeljuje vrednost promenljive $a promenljivoj $x: $x = $a;, a zatim uvećava promenljivu $a za jedan $а = $a + 1;
operatori poređenja za koji kao rezultat poređenja izraza vraćaju vrednosti tačno (true) ili netačno (false)
Operatori poređenja
operator
naziv
upotreba
==
jednako
$a == $b
===
identično (tip i vrednost)
$a === $b
!=
nije jednako (različito)
$a != $b
<>
nije jednako (različito)
$a <> $b
!==
nije identično
$a !== $b
<
manje od
$a < $b
>
veće od
$a > $b
<=
manje ili jednako
$a <= $b
>=
veće ili jednako
$a >= $b
logički operatori poređenja, takođe vraćaju vrednosti tačno (true) ili netačno (false). Osim operatora iz tabele mogu da se koriste i logički operatori nižeg prioriteta NOT (umesto !), AND (umesto &&), OR (umesto ||), kao i operator XOR za isključivu disjunkciju sa vrednošću tačno (true) ako su jedan operatora ili oba netačni.
operatori nad bitovima (engl.bitwise operators) omogućavaju da se ceo broj obrađuje kao grupa bitova kojim je broj predstavljen u memoriji. U PHP nemaju veliku primenu.[6]
Logički operatori
operator
naziv
upotreba
rezultat
&
konjunkcija
$a & $b
bitovi aktivni u $a i $b aktivni su i u rezultatu
|
disjunkcija
$a | $b
bitovi aktivni u $a ili u $b aktivni su i u rezultatu
~
negacija
~$a
bitovi aktivni u $a nisu aktivni u rezultatu i obrnuto
^
isključiva disjunkcija
$a ^ $b
bitovi aktivni ili u $a ili u $b, ali ne u oba, aktivni su i u rezultatu
(услов) ? (израз1) : (израз2) — ako je uslov ispunjen (tačan) vraća se vrednost prvog izraza, a ako nije tačan, vraća se vrednost drugog izraza
operator zanemarivanja greške @, može se upotrebiti ispred bilo kog izraza (osim u definicijama funkcija, klasa i strukturama kontrole), pri čemu se ignorišu poruke o grešci. Ipak, u koliko je uključena opcija track_errors iz konfiguracijske datoteke php.ini, poslednja greška će biti zabeležena u globalnoj promenljivoj $php_errormsg[25]
operator izvršenja[26] — par inverznih polunavodnika `` (engl.backticks). Sve što se postavi između njih PHP pokušava da izvrši kao naredbu zadatu na komandnoj liniji servera. Istu akciju obavlja i funkcija shell_exec,[27] koja mora biti isključena. Primer:
<?php$naredba=`ls -lrt`;//листа садржај текућег директоријума по датумуecho"<pre>$naredba</pre>";//резултат се може вратити некој променљивој или послати директно на стандардни излаз?>
ostali operatori: zapeta za razdvajanje argumenata ili parametara funkcije i za razdvajanje elemenata liste, operator za pravljenje objekata new i pristupanju njegovim članovima ->.[6] itd
Kada u jednom izrazu postoji kombinacija više operatora, one se izvršavaju redosledom koji zavisi od njihovih prioriteta i asocijativnosti.[28] Redosled prioriteta je:[28]
Prioritet
Operatori
Asocijativnost
1.
Operatori clone i new
neasocijativni
2.
Operator niza: [
sleva
3.
Operatori inkrementiranja i inkrementiranja: ++ --
neasocijativni
4.
Bitsko ne: ~
Unarno minus: -
Operatori promene tipa podatka: (int) (float) (string) (array) (object) (bool)
Operator neispisivanja greške: @
zdesna
5.
Operator instanceof
neasocijativni
6.
Logičko ne: !
zdesna
7.
Aritmetički operatori: * / %
sleva
8.
Aritmetički operatori: + -
Operator za pridruživanje niski: .
sleva
9.
Operatori pomeranja bitova: << >>
sleva
10.
Operatori provere nejednakosti: < <= > >= <>
neasocijativni
11.
Operatori provere jednakosti: == != === !==
neasocijativni
12.
Bitsko i: &
sleva
13.
Bitsko ekskluzivno ili: ^
sleva
14.
Bitsko ili: |
sleva
15.
Logičko i: &&
sleva
16.
Logičko ili: ||
sleva
17.
Uslovni operator: ? :
sleva
18.
= ^= <<= >>= =>
zdesna
19.
Logičko i: and
sleva
20.
Logičko ekskluzivno ili: xor
sleva
21.
Logičko ili: or
sleva
22.
Zapeta: ,
sleva
Osim navedenih operatora, najveći prioritet ima mala zagrada (), sa redosledom od unutrašnjih, ka spoljašnjim.[24]
Primer:
U izrazu:
$x=7/2+2*3;
se nalazi 4 operatora: operator dodele vrednosti (=) i tri aritmetička operatora. Operatori u izrazu će se primeniti po sledećem redosledu:
deljenje 7/2 i dobiće se rezultat 3.5
množenje 2*3 i dobiće se rezultat 6
rezultati prve dve operacije će se sabrati i dobiće se rezultat 9.5
Asocijativnost određuje kojim redosledom će se izvršavati operatori koji su istog prioriteta. Na primer, u izrazu:
6/2*3
operatori / i * su istog prioriteta i asocijativni sleva pa će se primeniti po sledećem redosledu:
deljenje 6/2 i dobiće se rezultat 3
množenje 3*3 i dobiće se rezultat 9
(Kada bi operatori bili asocijativni zdesna, dobio bi se rezultat 1.)
Sa druge strane, u programu:
$b=1;$c=2;$a=$b=$c;//трећи ред
u trećem redu, operatori dodele = su asocijativni zdesna pa će se primeniti ovim redosledom:
dodela vrednosti $c, što je 2, promenljivoj $b i dobiće se rezultat 2
dodela rezultata 2 promenljivoj $a i dobiće se rezultat 2
Na kraju izvršenja programa sve promenljive će imati vrednost 2.
Neasocijativni operatori se uopšte ne mogu koristiti na ovaj način. Na primer, kod:
$a==$b==$c
nije ispravan i za rezultat će imati grešku. Ukoliko se želi proveriti međusobna jednakost tri promenljive, ovi operatori se moraju grupisati po dva, na primer:
Naredbe (engl.statements) ili iskazi određuju neku akciju. Svaka PHP skripta je sastavljena od niza naredbi. Po pravilu naredbe se izvršavaju onim redom kojim su navedeni u programu, ali ovaj redosled može da se promeni nekom od naredbi za prenos toka programa, pri čemu prenos može ići na bilo koji drugi deo programa ili van njega. Osnovni oblik naredbe je izraz iza koga sledi znak tačka sa zapetom, kao završni znak naredbe.[23]
Složena naredba ili blok naredba je mehanizam koji grupiše skup naredbi u jednu semantičku celinu. Blokovi mogu da budu uklopljeni i svaki može da sadrži svoje sopstvene deklaracije, inicijalizacije i izvršne naredbe.[23]
Naredbe kojima se određuje tok izvršavanja pod određenim uslovima, mogu da se grupišu u jednu zasebnu strukturu. Ovakva struktura se postavlja između vitičastih zagrada: { i }. Upravljačke strukture, same za sebe, takođe predstavljaju jednu naredbu u obliku bloka. Koriste se različiti oblici upravljačkih (kontrolnih) struktura (engl.control structure),[29] koje se međusobno razlikuju po načinu ispitivanja uslova.
Jedna od osnovnih upravljačkih struktura je uslovno grananje, koje u zavisnosti od potrebe, može imati različite forme, a jedna od njih je sledeća:[30]
Kada interpretator naiđe na ovakvu strukturu, on prvo proverava da li je prvi prvi uslov (uslovni_izraz_1) ispunjen. Ako je prvi izraz tačan, izvršiće se prvi blok naredbi. Taj blok može biti grupa od jedne ili više naredbi, od kojih neke takođe mogu biti složene upravljačke strukture. U koliko izraz nije tačan, ispitivaće se istinitost drugog uslovnog izraza. Zatim, u koliko je drugi uslovni izraz tačan, izvršiće se drugi blok naredbi. U suprotnom, nastavlja se ispitivanje sledećih uslova i tako redom, sve do poslednje klauzule „else“. Ovaj zadnji obuhvata sve one slučajeve koji nisu ispunili ni jedan od prethodnih uslova.[31]
U slučaju da se blok_naredbi sastoji od samo jedne naredbe, nije neophodna upotreba vitičastih zagrada. Postoje slučajevi kada nije potrebno nastavljati dalje grananje, već se ono završava sa proveravanjem prvog izraza. U tom slučaju neće se pisati ni jedna od klauzula elseif, a ni else. Najprostiji oblik uslovnog grananja je sledeći:
<?phpif($godina_rodjenja<1992)echo"ради се о пунолетној особи";/* или у 2 реда, ради боље прегледности:*/if($godina_rodjenja<1992)echo"ради се о пунолетној особи";?>
U nekim situacijama je neophodno jednu istu promenljivu ili izraz uporediti sa različitim vrednostima, te u zavisnosti od rezultata poređenja, izvršiti različite akcije.[32] U tim slučajevima je, umesto strukture if, jednostavnije upotrebiti strukturu switch, koja ima sledeći oblik:
Ova struktura se izvršava tako što se vrednost izraza, znakovnog (string) ili celobrojnog (integer) tipa, redom poredi sa različitim slučajevima (engl.case) mogućih očekivanih vrednosti, sve dok se ne naiđe na slučaj kada su te dve vrednosti jednake. Odatle, pa na dalje, izvršavaju se svi blokovi naredbi, po redu, sve do poslednjeg, ili se prekida izvršavanje, u koliko postoji naredba za izlazak iz strukture (engl.brеаk). Poslednji blok naredbi je podrazumevani slučaj (engl.default), koji nije obavezno navesti, odnosi se na onakve vrednosti izraza, koje nisu bile obuhvaćene ni jednim od prethodnih slučajeva. Blokovi naredbi mogu da sadrže grupu od jedne ili više naredbi, od kojih neke, takođe mogu biti složene strukture upravljanja toka. Tipičan primer za upotrebu strukture switch je sledeći:
Upoređujući isti slučaj sa mogućnostima strukture if, dolazi se do zaključka, da bi u njoj ista promenljiva morala da se više puta ispisuje ponovo, kao i da bi cela struktura bila bi nepreglednija ako bi blokovi sadržali više od jedne naredbe:
Prilikom ispisivanja blokova naredbi, posebno treba obratiti pažnju na mesta na kojima će se stajati naredba break, odnos prekid izvršavanja. Jer, u koliko ne postoji naredba prekida, jednom kada je rezultat poređenja da tačnu vrednost, izvršavaju se svi sledeći blokovi naredbi, do kraja. Tako npr.:
<?phpswitch($dan){case1:$rezultat="понедељак";case2:$rezultat="уторак";case3:$rezultat="среда";case4:$rezultat="четвртак";case5:$rezultat="петак";default:$rezultat="викенд";// вредност променљиве $rezultat ће увек бити „викенд“}?>
za bilo koju vrednost promenljive dan, rezultat će uvek biti isti.
Takođe, blok naredbi može da bude i potpuno prazan, odnosno da ne sadrži ni jednu naredbu. Ovo naprotiv, nikako ne znači da se neće izvršiti ni jedan od narednih blokova naredba, baš naprotiv:
<
<?phpswitch($slovo){case"a":case"А":$rezultat="слово а";// резултат ће бити "слово а", када је $slovo == "a" и када је $slovo == "A"break;case"б":case"B":$rezultat="слово б";break;// резултат ће бити "слово б", када је $slovo == "б" и када је $slovo == "Б"}?>
Petlje (engl.loops) su upravljačke strukture za ciklično (iterativno) ponavljanje grupe naredbi, pod određenim uslovom. Izvršavanje petlji moguće je prekinuti u bilo kom delu petlje upotrebom naredbe break, dok se trenutni prelazak (skok) na sledeću iteraciju vrši naredbom continue. U zavisnosti od načina ispitivanja uslova za izvršavanje petlje i mesta gde je on postavljen razlikujemo nekoliko vrsta petlji.
Petlja „dokle god“ (engl.while) je jedna od najjednostavnijih. Uslov za ponavljanje nalazi se na vrhu naredbe. Ona se predstavlja na sledeći način[33]:
<?phpwhile(условни_израз){блок_наредби;}?>
Blok naredbi se ponavlja sve dok je ispunjen uslov u izrazu. Ako je njegova vrednost netačna od samog početka, blok naredbi se nikad neće izvršiti. Primer:
<?php$i=0;while($i<10){echo$i;// исписује бројеве од 0 до 9$i++;}?>
Petlja for je najsloženiji tip petlji.[34] Može da se koristi kada je broj iteracija unapred poznat.[31] Ima sledeći oblik:
<?phpfor(израз1;израз2;израз3){блок_наредби;}?>
Prvi izraz se koristi da bi se postavila početna vrednost brojača. U drugom izrazu se postavlja uslov za ponavljanje, a u trećem se menja vrednost brojača. Često se koriste kod nizova i/ili kada je potrebno popuniti neku tabelu.
Petlja za „svaki element“ (engl.foreach) je varijacija petlje for, specijalno napravljena za rad sa nizovima i drugim objektima.[35] Ona ima dva oblika[31]:
<?phpforeach(низasвредност){блок_наредби;}?>
Prolazi se kroz ceo niz i u svakoj iteraciji se vrednost elementa smešta u promenljivu. Ova vrednost kasnije se koristi u bloku naredbi. Drugi oblik naredbe je sledeći:
U nekim slučajevima, veoma korisne mogu biti i beskonačne petlje. One se bezuslovno izvršavaju sve dok se izvršava skirpta. Dva najčešća načina da se napravi beskonačna petlja su pomoću naredbe while (sa parametrom 1) ili pomoću naredbe for (bez parametara):[36]
Za upravljačke strukture if, while, for, foreach i switch postoji alternativna sintaksa, koja omogućava da se za date strukture umesto vitičastih zagrada { i }, za označavanje početka koriste dve tačke (:) , a endif;, endwhile;, endfor;, endforeach;, i endswitch; za završetaka strukture.[traži se izvor]
Uobičajena sintaksa
Alternativna sintaksa
<?phpif($a>0){echo"a има позитивну вредност";}elseif($a==0){echo"a је нула";}else{echo"а има негативну вредност";}?>
<?phpif($a>0):echo"a има позитивну вредност";elseif($a==0):echo"a је нула";else:echo"а има негативну вредност";endif;?>
Jedan od složenijih tipova promenljivih su nizovi (engl.arrays). Niz je grupa promenljivih referencirana preko istog imena. Za razliku od drugih programskih jezika, ovde elementi niza mogu biti podaci različitog tipa. U upotrebi su dve vrste nizova[37]:
numerički, kod kojih se koriste pozitivni celi brojevi za indeksiranje, počevši od indeksa 0
<?php$a=array(10,20,30,40,50,60);// променљива $niz је низ од 6 елемената са индексима од 0 до 5$zbir=$a[0]+$a[1]+$a[2]+$a[3]+$a[4]+$a[5];// збир ће имати вредност 210echo$zbir;?>
Za nizove je veoma pogodno koristiti petlje, da bi se prošli svi elementi:
<?php$a=array(1,"проба","успешна");/* низ од 3 елемента, од којихје сваки другачијег типа: $а[0] = 1; (број)$a[1] = "проба"; (стринг)$а[2] = "успешна"; (стринг) */$suma="";// додељује почетну вредност променљивој сума и тип знаковне (string) променљивеfor($i=0;$i<sizeof($a);$i++)// петља за обраду елемената низа{$suma.=" ".$a[$i];// придружује чланове низа у једну променљиву}echo$suma;// на крају сума има вредност "1 проба успешна"?>
<?php/* Drugi nacin */$a=array(1,"проба","успешна");/* низ од 3 елемента, од којихје сваки другачијег типа: $а[0] = 1; (број)$a[1] = "проба"; (стринг)$а[2] = "успешна"; (стринг) */for($i=0;$i<count($a);$i++)// петља за обраду елемената низа{echo" $a[$i]";}// на крају e вредност "1 проба успешна"?>
asocijativni, koji kao indekse (ključeve) mogu da koriste podatke znakovnog tipa (string), osim celobrojnih (integer)[38]
<?php$hrana=array("доручак"=>"сендвич","ручак"=>"мусака","вечера"=>"јабука");// дефинише низ $hrana од 3 елемента,// од којих сваки има свој кључ (знаковни индекс) и вредностforeach($hranaas$kljuc=>$vrednost){echo"$kljuc = $vrednost<br />";/* на излазу приказује "доручак = сендвич ручак = мусака вечера = јабука" */}?>
vraća niz koji se sastoji od svih elementa $a i $b
==
jednako
$a == $b
izraz je tačan ako su nizovi $a i $b imaju iste parove indeks/vrednost
===
identično
$a === $b
izraz je tačan ako su nizovi $a i $b imaju iste parove indeks/vrednost, po istom redosledu i tipu podataka
!=
različito
$a != $b
izraz je tačan ako je $a različit od $b
<>
različito
$a <> $b
izraz je tačan ako je $a različit od $b
!==
nije identično
$a !== $b
izraz je tačan ako $a nije identičan $b
Pristup elementima niza je veoma jednostavan korišćenjem uglastih zagrada []. PHP raspolaže velikim brojem funkcija za rad sa nizovima.[38][40]
Funkcije nizova
naziv funkcije
opis funkcije
unset()
eliminisanje elemenata iz niza
array_key_exists()
provera za postojanje nekog indeksa (ključa) u nizu
array_search()
pretraga elemenata na osnovu indeksa (ključa)
in_array()
provera za postojanje neke vrednosti u nizu
array_keys()
vraća niz ključeva navedenog niza
array_values()
vraća niz vrednosti navedenog niza
array_splice()
brisanje elemenata niza ili njihova zamena
count()
vraća broj elemenata navedenog niza (sinonim: sizeof())
sort()
uređuje niz po njihovim vrednostima u rastući redosled
rsort()
uređuje niz po u opadajući redosled
asort()
uređuje nizove po njihovom vrednostima u rastući abecedni redosled, pri čemu se vrši njihova reindeksacija
ksort()
uređuje indekse niza po vrednostima indeksa u rastući abecedni redosled
krsort()
uređuje indekse niza po vrednostima indeksa u opadajući redosled
shuffle()
meša elemente niza (nasumično uređivanje)
array_sum()
sabira vrednosti svih elemenata navedenog niza
array_merge()
spaja dva ili više nizova u jedan. Važno je voditi računa o indeksima, jer se prilikom spajanja eliminišu duplikati (važi samo za znakovne indekse, dok se brojčani automatski uređuju)
explode()
formira niz iz navedene znakovne promenljive (teksta). Osim imena niza i promenljive, zahteva i znak za razdvajanje
implode()
formira tekst iz navedenog niza. Osim imena niza i promenljive, zahteva i znak za razdvajanje
array_diff()
upoređuje dva ili više nizova, i kreira novi na osnovu elemenata po kojima se oni razlikuju
Višedimenzionalni nizovi (engl.multidimensional arrays) sadrže elemente koji mogu takođe biti nizovi. Kod njih svaki element ima više od jednog indeksa. Ako svaki element ima dva indeksa, onda se radi o dvodimenzionalnom nizu.[41] Primer:
<?php$drugovi=array(array(1,"Име"=>"Драган","висина"=>"195.5","тежина"=>"90.0","омиљени_спорт"=>"кошарка"),array(2,"Име"=>"Марко","висина"=>"185.5","тежина"=>"80.5”, ”омиљени_спорт"=>"пливање"),array(3,"Име"=>"Саша","висина"=>"180.5","тежина"=>"75.0","омиљени_спорт"=>"фудбал"));/* Дефинисан тродимензионални низ са 9 елемената и три кључа: висина, тежина и омиљени спорт.*/?>
Višedimenzionalni nizovi omogućavaju obradu vrlo složenih struktura podataka, kao što su one koji se koriste u tabelama ili bazama podataka. Ovi nizovi takođe mogu biti numerički i asocijativni, te svaki element može biti podatak različitog tipa, što omogućava veliku fleksibilnost i funkcionalnost.
Za lakše rukovanje nizovima, na raspolaganju su napredne funkcije. Funkcija list() dodeljuje vrednosti elemenata niza, promenljivama iz liste argumenata[42]
Funkcija print_r() prolazi kroz ceo niz i razlaže ga, prilažući sve njegove ključeve i pridružene vrednosti. Funkcija array_walk(), prolazi ceo niz i vraća vrednosti svih njegovih elemenata, bez ključeva. array_flip(), zamenjuje vrednosti ključeva sa njihovim vrednostima, a u slučaju asocijativnog niza, istovremeno radi i obrnuto: zamenjuje sve vrednosti elemenata niza vrednostima njihovih ključeva.[traži se izvor] Za dodeljivanje vrednosti određenim elementima niza koristi se funkcija array_fill().[43]
<?php$a=array("a"=>"јабука","б"=>"банана","в"=>array("караманка","калуђерка","виљамовка"));print_r($a);// резултат штампа у облику// [а] => јабука// [б] => банана// [в] => Array// (// [0] => караманка// [1] => калуђерка// [2] => виљамовка// )array_walk($a);// враћа резултат// јабукабананакараманкакалуђеркавиљамовка?>
Funkcije omogućavaju izvršavanje određenog bloka naredbi, koje se ponavljaju. PHP ima dosta već ugrađenih, ali postoji mogućnost definisanja sopstvenih funkcija. Funkcija može da se pozove iz nekog drugog dela skripte, prosleđujući joj argumente, a ona zatim, kada se izvrši, može da vrati neku vrednost. Razlozi zbog kojeg se koriste funkcije mogu biti[44]:
izbegavanje ponovnog pisanja već napisanog dela koda
lakše razumevanje koda
Funkcija se deklariše pomoću ključne rečifunction, na sledeći način:
Prilikom izbora imena funkcije, treba poštovati ista pravila, koja važe za imena promenljivih, s tom razlikom da se kod funkcija mala i velika slova ne razlikuju i ne piše se znak $. Preporučuje se da ime funkcije asocira na akcije, koje ona treba da realizuje.[45] Mada je u drugim programskim jezicima dozvoljeno, ovde se za imena funkcija ne mogu iskoristi imena već postojećih funkcija, jer to dovodi do greške u programu, osim ako se istoimena funkcija ne nalazi u nekoj spoljašnjoj datoteci. Ipak, čak ni tada se ne preporučuje, jer može otežati tumačenje napisanog koda.[46]
U parametrima se navodi niz promenljivih, međusobno razdvojenih zapetom. Funkcija može imati jedan ili više parametara. Postoje slučajevi kada neće biti potreban ni jedan parametar. Međutim čak i u tada je obavezno pisanje običnih zagrada prilikom deklarisanja funkcije.[45]
functionПоздрав(){return"ДОБРО ДОШЛИ";}
Da bi se funkcija izvršila, nije dovoljno da samo bude deklarisana. Da bi se iskoristila ona mora da bude pozvana.[46] Nije neophodno, ali se preporučuje, da pre pozivanja, funkcija bude već deklarisana. Prilikom pozivanja funkcije, navodi se lista argumenata.[47]
име_функције(листа_аргумената);
Redosled argumenata, koji se navode u pozivu, treba da odgovara redosledu parametara u deklaraciji funkcije. Kao argumenti, mogu se navesti promenljive, određene vrednosti ili izrazi. Brojne vrednosti se mogu proslediti sa navodnicima ili bez njih. Nije neophodno da broj elemenata iz lista argumenata bude jednak broju elemenata iz liste parametara. Ako je broj argumenata manji i nemaju unapred dodeljenu vrednost nedostajućim promenljivama se dodeljuje vrednost null (mada dolazi do greške, ona se neće zaustaviti izvršavanje funkcije). Ako funkcija vraća neku vrednost, ona se u pozivu može dodeliti nekoj promenljivoj ili upotrebiti u nekom izrazu.[24]
Kada se izvršavanje funkcije završi, tok programa se nastavlja, tačno od mesta odakle je pozvana. Izvršavanje može da se prekine pošto se prođe kroz celu funkciju ili se tok izvršavanja može prekinuti u bilo kom delu bloka, upotrebom jedne ili više naredbi za povratak (engl.return). Preterana upotreba naredbe za povratak u okviru iste funkcije, može otežati razumevanje toka funkcije. U praksi, najbolje je da postoji jedan ulaz i jedan izlaz iz bloka naredbi.[44]
Dozvoljena je rekurzija, odnosno, funkcija može da pozove samu sebe.[24] U sledećem primeru računa se faktorijel prosleđenog prirodnog broja:
functionфакторијел($број){if($број<0){return"недозвољена вредност";}elseif(број==0){return1;}else{$помоћна=$број*факторијел($број—1);// вредност факторијел се добија рекурзијомreturn$помоћна;}}
Navođenjem promenljivih u listi argumenata, promenljive se mogu proslediti[46].[traži se izvor]:
po vrednosti (engl.by value), kada se unutar funkcije njihove vrednosti ne menjaju
po adresi, odnosno referenci (engl.by reference) pomoću simbola &, kada je neophodno da se vrednost promenljive promeni unutar funkcije. Poziv po adresi moguć je jedino prilikom deklarisanja funkcije, nikako pri njenom pozivanju, u okviru argumenata[36]
functionдодај_један(&$број)// декларација функције са параметром по адреси (&){$број=$број+1;//увећава вредност за један}/* касније се позива функција*/$број=1;// променљивој се додељује почетна вредностдодај_један($број);// позива се функција са аргументом (променљива $broj)echo$број;// добија вредност 2
Parametri mogu da imaju unapred dodeljene vrednosti (engl.default values). Pri pozivanju funkcije, njih nije obavezno navesti i samo u tom slučaju, unapred dodeljene vrednosti imaju efekta. U suprotnom se koriste vrednosti prosleđene iz liste argumenata. U deklaraciji funkcije, parametri sa unapred određenim vrednostima, navode se na kraju liste.[45]
functionдодај_сабирак(&$број,$сабирак=1)// параметар по адреси (&) и параметар са унапред додељеном вредношћу{$број=$број+$сабирак;}/* касније се позива функција*/$број=1;// променљивој се додељује почетна вредностдодај_сабирак($број);// позива се функција са аргументом (променљива $број)echo$број;// $број добија вредност 2$збир=1;$мој_сабирак=10;додај_сабирак($моја_сума,$мој_сабирак);// позива функцију са оба аргументаecho$збир;// збир је 11
Sve promenljive koje se koriste u okviru funkcija, osim onih koje se nalaze u listi parametara prosleđene po adresi, dobijaju početne vrednosti prilikom svakog pozivanja funkcije. Te promenljive su lokalnog karaktera, njihove vrednosti se dodeljuju i raspoložive su isključivo u okviru iste funkcije. Važi i obrnuto, promenljive definisane van funkcije, nisu raspoložive unutar funkcije, čak ni onda kada se van i u okviru funkcije koriste istoimene promenljive.[17] Na primer, promenljiva $глоб ima dodeljenu vrednost 1 na samom početku programa. Takođe, u okviru funkcije postoji istoimena lokalna promenljiva $глоб. Ove dve promenljive neće imati istu vrednost. Npr.
<?php$глоб=1;// глобална променљива $глобfunctionмоја_функција(){echo$глоб;// $глоб је локална променљива и нема додељену вредност*/ }моја_функција();//позива функцију?>
Da bi promenljive korišćene lokalno, u okviru neke funkcije imale globalni karakter, odnosno da bi njene vrednosti bile na raspolaganju i van funkcije, promenljive je neophodno posebno naznačiti na jedan od sledećih načina:
korišćenjem ključne reči global:
global$име_променљиве[,...];
U listi je moguće navesti neograničen broj promenljivih[48], što bi primenjeno u prethodnom primeru, za promenljivu $глоб bi izgledalo ovako:
<?phpfunctionмоја_функција(){global$глоб;echo$глоб;//променљива $глоб има вредност 1}?>
korišćenjem asocijativnog niza $GLOBALS, koji je raspoloživ uvek i svuda, u bilo kom okruženju, zbog čega se naziva super globalnim. Elemente ovog niza čine vrednosti, dok indekse niza čine imena raspoloživih promenljivih.[17] U prethodnom primeru:
<?phpfunctionмоја_функција(){global$глобална;$GLOBALS["ц"]=$глобална+1;// дефинисана је локална променљива $ц}?>
Lokalne promenljive u okviru funkcije gube svoje vrednosti, između različitih poziva i ponovo se dodeljuju prilikom svakog izvršavanja. I ako vrednosti lokalnih promenljivih ne mogu biti korišćene van funkcije, postoji mogućnost da se vrednosti promenljivih iz prethodnog poziva sačuvaju, tako što se promenljive unutar funkcije deklarišu kao statičke, pomoću ključne reči static i pri tome im se može dodeliti neka početna vrednost.[17]
static $име_променљиве [= вредност];
Početna vrednost će biti dodeljena samo pri prvom pozivu funkcije.[48] Primer: funkcija_uvećanja će pri svakom pozivu uvećati vrednost promenljive $стат za 6:
Na raspolaganju je grupa funkcija za rad sa datotečnim sistemima.[49] Prva funkcija koja omogućava pristup datoteci je funkcija za otvaranje datoteke, pri čemu se stvara objekat tipa resurs, za opis datoteke (engl.file descriptor),[50] gde se smešta informacija o datoteci. Otvaranje se postiže uz pomoć funkcije fopen[51]:
koja ima četiri moguća parametra, od kojih su dva obavezna i najčešće se koriste:
ime datoteke se pretpostavlja da se radi o nekoj dostupnoj veb adresi, koja se traži uz pomoć upravljača protokola, odnosno omotača (engl.wrapper).[52]
način pristupanja datoteci može da ima jednu od sledećih vrednosti:
Kombinovani operatori dodele
način
opis
"r"
otvara za čitanje, pokazivač se postavlja na početak datoteke i odatle počinje da piše, bez brisanja prethodnog sadržaja, ako datoteka već postoji, daje obaveštenje
"r+"
otvara za čitanje i pisanje, ostalo isto kao i prethodnoj opciji
"w"
otvara samo za pisanje, pokazivač se postavlja na početak datoteke i odatle počinje da piše, brišući sav prethodni sadržaj. Ako datoteka ne postoji, pokušaće da napravi novu
"w+"
otvara za čitanje i pisanje, ostalo isto kao i u prethodnoj opciji
"a"
otvara samo za pisanje, čuva prethodni sadržaj datoteke, postavlja pokazivač na kraj datoteke i odatle počinje da piše. Ako datoteka ne postoji, pokušaće da napravi novu
"a+"
za čitanje i pisanje, ostalo isto kao i opcija a
"x"
pravi novu datoteku i otvara je samo za pisanje, postavljajući pokazivač na početak datoteke. Ako datoteka već postoji, daje grešku. Ako datoteka ne postoji, pokušaće da napravi novu
"x+"
pravi novu datoteku i otvara je za čitanje i pisanje. Ostalo isto kao prethodna opcija
"c"
otvara datoteku samo za pisanje. Ako datoteka ne postoji, pravi novu datoteku, ako postoji pravi novu datoteku. Pokazivač se postavlja na početak datoteke.
"c+"
otvara datoteku za čitanje i pisanje. Ostalo isto kao i opcija c
indikator za korišćenje putanje spoljašnjih datoteka naveden u opciji include_path u okviru konfiguracijske datoteke php.ini
Rezultat funkcije može se smestiti u promenljivu, koja sadrži pokazivač na resurs (označenu kao $фд u primeru), ako je otvaranje bilo uspešno ili se dobija vrednost netačno (false), ako je došlo do greške prilikom otvaranja.
Jednom kada se datoteka uspešno otvori, moguće je čitanje i pisanje podataka iz nje.
Pisanje se se vrši uz pomoć funkcije fwrite:
fwrite($фд,$садржај[,$дужина_у_бајтовима]);
kojoj se prosleđuju: pokazivač na resurs, sadržaj koji se upisuje, kao obavezni argumenti, promenljiva tipa string. Moguće je odrediti dužinu informacije za upis, koja se izražava brojem bajtova. Rezultat ove funkcije može biti broj upisanih bajtova, ako se upisivanje uspešno izvršilo ili vrednost netačno ako je došlo do greške prilikom upisivanja
Čitanje sadržaja, moguće je jedino ako je datoteka prethodno uspešno otvorena. Može se izvršiti:
gde je promenljiva koja sadrži pokazivač na resurs (označena kao $фд u primeru) jedini obavezni parametar. Uz njega se može navesti promenljiva u koju će biti smešten broj učitanih bajtova. Učitavanje je moguće sve dok pokazivač ne dođe do kraja datoteke. Funkcija vraća učitanu liniju u koliko se uspešno izvršila, odnosno vrednost netačno, ako je došlo do greške. Učitana linija obično se smešta u niz ili u znakovnu promenljivu (string).
celog sadržaja koji se smešta u niz pomoću funkcije fgets[54]
celog sadržaja koji se smešta u znakovnu (tekstualnu) promenljivu file_get_contents[55]
Pošto je broj otvorenih resursa ograničen, kada se završe sve potrebne akcije nad datotekom, preporučuje se njeno zatvaranje, pomoću funkcije fclose:
PHP u svom konstruktoru (jezičkoj osnovi)[56] sadrži nekoliko funkcija koje omogućavaju upotrebu spoljašnjih datoteka (engl.external files) u okviru skripte.[40] Različiti su razlozi zbog kojih se koriste spoljašnje datoteke za smeštanje: zajedničkih promenljivih, korisničkih funkcija[57], klasa[40], HTML koda za različite stranice / skripte,[57] podataka za pristup bazama podataka[45]. Smeštanjem u spoljašnje datoteke postiže se lakša preglednost glavnog koda, ušteda vremena, kada je potrebno da se promeni neki podatak iz datoteke i omogućava se lakša lokalizacija mogućih grešaka u kodu.[58] Koriste se četiri funkcije:
Svakoj od njih se prosleđuje ime datoteke i putanja do nje.[40] Navođenje putanje nije obavezno u koliko je ona navedena u opciji include-path konfiguracijske datoteke php.ini ili ako se datoteka nalazi u istom direktorijumu kao i skripta koja poziva spoljašnju datoteku.[59] Nije obavezna ni upotreba zagrada, s obzirom da se radi o osnovnim funkcijama, najčešće se koriste zbog lakše preglednosti. Nazivi datoteka, koje se navode kao argumenti ovih funkcija mogu da budu proizvoljni, ali se preporučuje da njihove ekstenzije uvek budu .php ili .inc.php. U suprotnom, ako korisnik pokuša sam da otvori neku od ovakvih datoteka, interpretator neće neće prepoznati kao PHP kod i prikazaće njihov sadržaj, kao da se radi o običnim tekstu.[60]
Sve četiri funkcije veoma slično rade: uključuju čitav sadržaj navedene datoteke u tekuću skriptu. Razlika između funkcije include i require je u ponašanju u slučaju da datoteka ne postoji ili nije vidljiva na navedenoj putanji. U tom slučaju funkcija include samo daje upozorenje, dok je funkcija require „stroža“ i daje grešku, koja zaustavlja izvršavanje skripte.[60] Sufiks „_once“ se odnosi na funkcije i klase iz spoljašnje datoteke. Njime se pojašnjava da se deklaracija objekata vrši samo jednom, čime se sprečava višestruko deklarisanje, koje PHP ne dozvoljava, pošto inače, ista spoljašnja datoteka može da se navede više puta, na različitim mestima u programu.[60]
Primer korišćenja spoljašnjih datoteka[61]:
Datoteka za zaglavlje stranice veb (zaglavlje.php) ima sledeći sadržaj.
Isto zaglavlje i podnožje, pa čak i meni, mogu da se iskoriste za različite stranice, čime se postiže uštedi vremena. U koliko se koristi ćirilice, spoljašnje datoteke najbolje je da budu sačuvane u UTF-8 formatu.
U objektno-orijentisanom programiranju, za smeštanje određene grupe funkcija i promenljivih koriste se klase.[62] Da bi bile dostupnije u bilo kom delu istog programa ili u nekim drugim programima, klase se najčešće ispisuju u posebnim spoljašnjim datotekama.[60] Klase same za sebe ne sadrže podatke. Na osnovu klasa prave se objekti.[17] Klase su modeli[17], apstraktne predstave objekata sa zajedničkim osobinama i ponašanjem.[63]
Klasa se deklariše uz pomoć ključne reči class na sledeći način[17]:
Prilikom izbora imena klasa važe ista pravila, kao i za imena funkcija i promenljivih. Osim toga, interpretator ne pravi razliku između malih i velikih slova, ali je običaj da u imenima klasa početak reči bude veliko slovo, a da ostala slova budu mala, kako bi se razlikovale od ostalih identifikatora[40]. Svojstva[64], odnosno atributi (engl.attributes), osobine ili karakteristike su skup promenljivih, od kojih neke mogu da imaju početnu vrednost. Vrednost se definiše preko jednostavnih izraza, koji ne mogu da sadrže druge promenljive, niti funkcije. Akcije[62] ili ponašanje klase definiše se preko metoda[64], koje zapravo imaju ulogu funkcija u strukturnom programiranju,[62] s tom razlikom da je dozvoljeno da metoda neke druge klase ili spoljašnja korisnička funkcija nose isto ime. Gledajući definiciju klase, lako se može zaključiti da su to zapravo kolekcije promenljivih i funkcija, preko kojih se definišu njena svojstva i ponašanje.[64] Kako svojstva, tako i metode mogu imati različitu vidljivost u odnosu na svoje okruženje. Ovo se deklariše preko ključnih reči[17]:
public — atributi i metode su javni, odnosno potpuno su dostupni van postojeće klase
private — atributi i metode su dostupni jedino unutar klase
protected — atributi i metode su dostupni unutar same klase ili unutar klasa izvedenih (engl.extended) od nje.
Za metode važi pravilo da ako se ne navede ni jedna od od ove tri ključne reči, ona se smatra javnom, dok je kod promenljivih obavezno navesti jednu od tri mogućnosti za njihovu dostupnost. Ovo pravilo je uvedeno od pete verzije (PHP.5), dok su u prethodnoj verziji sve metode i svi atributi bili javni. Tada je za atribute bilo obavezno upotrebiti ključnu reč var, koja ima isto značenje kao i public, dok za metode međutim, nije bilo mogućnosti izbora dostupnosti, sve su bile javne.[17]
Da bi se stvorio novi objekat potrebno je da se napravi nova instanca (engl.instance), odnosno primerak klase,[60] pomoću ključne reči new[64], pri čemu objekat dobija strukturu klase i osim toga, sadrži podatke.[17]
име_објекта=newиме_класе(листа_аргумената);
Za određeni objekat (instancu klase), da bi se pristupilo nekom atributu ili metodi:
Isključivo unutar same klase, koristi se ključna reč $this, promenljive koja označava sopstveni objekat, uz operator ->[17]:
$this->име_атрибута;$this->име_методе();
Van klase, jednom kada je napravljen novi objekat i pošto se izvršila metoda konstruktora, pomoću imena konkretnog objekta i operatora ->[64]:
U PHP postoji više ugrađenih specijalnih metoda, koje imaju određenu funkciju u klasi. Jedna od specijalnih metoda može da nosi isto ime kao i sama klasa. U tom slučaju, radi se o metodi konstruktoru. Prilikom kreiranja (instanciranja) novog objekta, to je prva metoda, koja se automatski poziva. Uz pomoć nje se dodeljuju određene početne vrednosti promenljivih (atributa) u okviru klase, a moguće je izvršiti i određene funkcije. Drugi način za označavanje konstruktora je pomoću metode __construct(), која носи две доње црте испред имена. Заправо, да би идентификовао методу конструктора, интерпретатор прво тражи функцију која носи назив __construct(), pa ako je ne pronađe, onda traži metodu koja nosi ime klase,[17] jer u prethodnim verzijama PHP nije postojala metoda __construct().
Mada nije obavezno, osim konstruktora, svaka klasa može da sadrži i uništavača __destruct(), funkciju bez parametara, koja se izvršava automatski, pošto se eliminiše i poslednji objekat (instanca) dotične klase.[17] Ovu metodu nije neophodno posebno navoditi, jer je već automatski ugrađena, ali ako se navede, u okviru klase moguće je iskoristiti podatke iz objekta (da se upišu u bazu podataka npr.), upravo pre nego što se objekat uništi.[17] Metoda __destruct() van klase poziva se pomoću naredbe[64]:
unset($име_објекта);
Ponekad postoji potreba da se prilikom pozivanja nekog objekta, umesto cele strukture klase dobija samo jedna znakovna niska (literal), za šta se koristi metoda __toString. Pomoću ove metode, vraća se u obliku teksta, ona informacija o klasi, za koju se smatra da je shodna.[17]
Za kopiranje objekata koristi se metoda __clone. Ona automatski kopira sve podatke iz jednog objekata u drugi. S obzirom da automatsko kopiranje nije uvek željeno ponašanje prilikom kopiranja objekta[65], postoji mogućnost da se u okviru same klase precizno definišu samo podaci koje treba kopirati, kao i način na koji će se to izvršiti.[64] Ova metoda poziva se pomoću ključne reči clone:
U praksi se ne preporučuje da sve metode i atributi jedne klase budu javni. Da bi se dobile i menjale vrednosti određenih atributa, obično se koriste posebne javne metode za pristup, dok se sami atributi deklarišu kao privatni.[64] Tako npr.[66] kao u klasi „Korisnik“ sa atributima: broj, ime i prezime, deklariše se 6 funkcija za pristup:
Međutim, klasa može da ima veliki broj atributa i metoda, pa pisanje ovakvih funkcija za pristup može biti veoma komplikovano. Kada se ne radi o nedostupnim (nedeklarisanim ili privatnim) atributima ili metodama, koji se neće pozivati po referenci (adresi) i nisu statički, moguće je kreirati atribute i metode, na dinamički način korišćenjem specijalnih metoda (engl.magic methods), koje se izvršavaju automatski svaki put[67]:
__set() kada se upisuju podaci u objekat
__get() kada se učitavaju podaci iz objekta
Način na koji će se izvršiti učitavanje ili upisivanje podataka, definiše se u okviru klase. Tako u prethodnom primeru, umesto metoda sa prefiksom get i set, moguće je upotrebiti samo dve funkcije, koje važe za bilo koji atribut:
Za ispitivanje da li neki od ovakvo definisanih atributa ima vrednost, koristi se funkcija empty() pri čemu se u klasi automatski izvršava metod __issset(), a pri pozivanju nevidljivih metoda, izvršava se metod „__call“.[68]
<?phpclassТест{protectedелементи=array();publicfunction__get($парам){ifarray_key_exists($парам,$this->елементи){return($this->елементи[$парам]);}else{return("не постоји атрибут");}}publicfunction__set($кључ,$вредност){$this->елементи[$кључ]=$вредност;}publicfunction__isset($парам){return(isset($this->елемент[$парам]));}}$објекат=newТест();print$објекат->брзина;// ”не постоји елемент”, јер још увек није постављена вредност$објекат->брзина=”55”;if(emtpy($objekat->брзина)){echo"атрибут брзина је постављен”;}$објекат->брзина = null;if (emtpy($objekat->брзина)){ echo "Такођепозиваметоду__isset”;// мада је вредност атрибута празна (null) атрибут је дефинисан}?>
Nasleđivanje (engl.Inheritance) je jedna od najkorisnijih alatki u objektno-orijentisanom programiranju, koja omogućava da korisnik definiše osnovnu klasu obično sa jednostavnijim ili zajedničkim atributima i metodama, i na osnovu nje izvede nove klase, koje sadrže izvesne specifičnosti u odnosu na osnovnu klasu. Kaže se da ako je B klasa isto što i A, a ne važi obrnuto, onda je A natklasa ili osnovna klasa, a B je izvedena klasa.[69] Osnovna klasa se naziva roditelj ili natklasa (engl.superclass), a sve klase izvedene od nje su njena deca ili potklase (engl.subclass). Deca nasleđuju sve roditeljske atribute i metode, deklarisane kao javne (public) ili kao zaštićene (protected), neke od njih mogu da se izmene (engl.overload) i takođe, svako dete može da nadogradi klasu roditelja, novim atributima i metodama.[70] Specijalno u slučaju da su neki metod ili cela roditeljska klasa, deklarisani kao završni ili finalni (engl.final), oni neće moći da budu izmenjen u izvedenoj klasi.[71] Dok svaka klasa roditelj može imati više izvedenih klasa, svaka izvedena klasa može imati samo jednog roditelja, odnosno, nasleđivanje je jednostruko. Za razliku od drugih programskih jezika[68], poput C++ što ih čini ili vrlo složenim ili manje efikasnim[72], ovde višestruko nasleđivanje nije podržano.[68]
Deklarisanje izvedene klase vrši se na osnovu roditeljske klase uz pomoć ključne reči extends,[70]
classИмеКласеДететаextendsИмеКласеРодитеља{// тело класе детета}
zbog čega je neophodno da roditeljska klasa bude prethodno deklarisana, pre bilo koje izvedene klase[73] i njen kod mora da bude dostupan izvedenoj klasi[64]. Roditeljska klasa najčešće se piše u posebnoj datoteci, što je potrebno navesti na samom početku, pomoću naredbe za korišćenje spoljašnjih datoteka pre deklarisanja izvedene klase.
Osim toga, u izvedenoj klasi navode se samo novi ili oni atributi i metode iz roditeljske klase, koje je potrebno izmeniti. Istoimene metode navedene u izvedenoj klasi neće se izvršiti u roditeljskoj klasi, osim ako se u izvedenoj klasi specijalno ne navede poziv na roditeljsku metodu.[73] Za pozivanje metoda roditeljske klase (uključujući i metodu konstruktor) iz izvedene klase, koristi se ključna reč parent, umesto imena roditeljske klase, a iza ključne reči slede dve dvotačke i ime metode, koju treba izvršiti.[74]
classРодитељ{functionпример(){echo"метода — пример у родитељској класи.<br />\n";}}classДетеextendsРодитељ{functionпример(){echo"Измењена метода — пример.<br />\n";parent::пример();//позива истоимену родитељску методу}}
U sledećem primeru nalazi se osnovna klasa Zaposleni, iz koje se izvodi posebna klasa Prodavac, kao specifičan slučaj Zaposlenih, kod kojih u se u obračunu plate uzima u obzir i provizija od količine prodatih proizvoda. Kasnije, u glavnom delu skripte, koriste se obe klase:
Klase roditelj i dete
<?phpclassЗапослени{private$име;protected$плата;private$датум_запослења;publicfunction__construct($име,$плата,$датум){$this->име=$име;$this->плата=$плата;$this->датум_запослења=$датум;}publicfunctionрачунаПлату(){return$this->плата;}}classПродавацextendsЗапослени{private$продато;private$провизија;publicfunction__construct($име,$плата,$датум,$провизија){parent::__construct($име,$плата,$датум);$this->продато=0;$this->провизија=$провизија;}publicfunctionпродаја($количина){$this->продато=$this->продато+$количина;}publicfunctionрачунаПлату(){return($this->плата+($this->продато*$this->провизија/100));}}$марко=newЗапослени("Марко Краљевић",56000,"10/04/2010");$ана=newПродавац("Ана Бркић",40000,"21/02/2012",50);$маркова_плата=$марко->рачунаПлату();$ана->продаја(1000);$анина_плата=$ана->рачунаПлату();echo"<p>Маркова плата је $маркова_плата</p>";//Маркова плата је 56000echo"<p>Анина плата је $анина_плата</p>";//Анина плата је 40500?>
Da bi se utvrdilo da li je neki objekat primerak određene klase, koristi se operator instanceof, koji primenjen nad nekim objektom u izrazu, vraća vrednosti tačno ili netačno. Za primerke nasleđenih klasa, rezultat operacije u odnosu na roditeljsku klasu, takođe će se dobiti tačna vrednost[75]:
<?phpclassКласаРодитељ{}classКласаДетеextendsКласаРодитељ{}$објекат=newКласаДете;var_dump($ainstanceofКласаДете);// тачно boolean(true)var_dump($ainstanceofКласаРодитељ);// тачно boolean(true)?>
Apstraktne klase (engl.abstract classes) uvedene su od 5. verzije PHP, za potrebe objektno-orijentisanog programiranja i predstavljaju šablone ili modele struktura za klase naslednike izvedene iz nje. Apstraktna je svaka ona klasa koja sadrži najmanje jednu apstraktnu metodu i obrnuto, u svakoj apstraktnoj klasi mora da postoji najmanje jedna apstraktna metoda.[68] Ni jedna apstraktna metoda ne sme biti deklarisana kao privatna, jer treba da bude nasleđena, niti može biti finalna, jer treba da bude izmenjena u nasleđenoj klasi.[76] Apstraktne metode su one koje sadrže isključivo deklaraciju metode, bez pisanja koda koji opisuju kako će se metoda izvršiti.[77] Po apstraktnom modelu nije moguće stvoriti ni jedan objekat, svaki pokušaj da se tako nešto učini daje grešku. Apstraktne klase deklarišu se pomoću ključne reči abstract.[68]
Sve metode deklarisane kao apstraktne u šablonu, obavezno moraju da budu definisane i u izvedenim klasama i njihova vidljivost, odnosno domen, mora biti isti ili još restriktivniji, nego u osnovnoj klasi. Npr. ako je neka metoda u apstraktnoj klasi definisana kao zaštićena (protected), onda ista metoda mora da postoji i u izvedenoj klasi i može biti deklarisana ili kao zaštićena ili kao javna, ali nikako ne može biti privatna.[78]
Interfejsi (engl.interfaces) su svojevrsna skica ili šablon[72] sastavljen od javnih apstraktnih metoda, pri čemu se metode u interfejsu deklarišu, ne sadrže nikakve detalje oko njihovog izvršavanja, navode se samo imena metoda i parametri. Isto kao i kod apstraktnih klasa, od interfejsa se ne mogu stvarati objekti. Interfejsi služe isključivo za definisanje one grupe metoda koje treba da postoje u svakoj klasi u kojima se interfejs primenjuje, odnosno implementira (engl.implement). Za deklaraciju interfejsa koristi se ključna reč interface. Osim metoda, interfejsi mogu da sadrže i konstante.[79] Isto kao i klase, interfejsi mogu da nasleđuju jedan drugog.
Sve metode interfejsa su javne, zbog čega nije neophodno navoditi ključnu reč public.[17]
Da bi se interfejsi primenili u klasama koristi se ključna reč implements, iza koje sledi lista interfejsa.
Klasa može da nasledi samo jednu klasu i može da primeni više različitih interfejsa, pri čemu u tim interfejsima ne smeju da postoje istoimene metode.[79] Osim toga, klasa mora da sadrži sve metode deklarisane u interfejsima. Ako se ne definišu eksplicitno u klasi, metode će se primeniti implicitno, ali onda klasa koja ih primenjuje mora da bude apstraktna, jer u suprotnom dolazi do greške.[80] Osim toga, prilikom upotrebe interfejsa u klasama, bitno je kojim će se redom svaka od metoda izvršavati. Interfejsi mogu da se upotrebe u klasama onoliko pute koliko je to potrebno.[79]
Dok su interfejsi standardne strukture u nekim drugim jezicima, kao npr. u Javi, oni se u PHP ređe upotrebljavaju.[68]
Imenski prostor je uveden od verzije 5.3[81] i prevashodno je zamišljen radi rešavanja konflikta oko istoimenih metoda i funkcija, kako bi mogle da se koriste u okviru istog projekta. Ovo je posebno pogodno u slučaju da se radi o kompleksnim projektima, koji su raspoređeni po različitim datotekama i kada u razvoju aplikacije učestvuje grupa programera.[82] Za deklarisanje imenskog prostora koristi se ključna rečnamespace i pri čemu moraju da se ispune sledeći uslovi[83]:
pre prve deklaracije imenskog prostora ne sme da postoji nikakav drugi PHP kod (ni HTML kod, osim oznake ni beline), osim deklaracija uz pomoć ključne reči declare.[84] Odnosno, ispred deklaracije imenskog prostora mogu da stoje samo oznaka <HTML>, oznaka za PHP kod <?php, kao deklaracije za blokove[85]
imenski prostor je jedinstven i za njegovu deklaraciju ne mogu se upotrebiti ključne reči[83]. Za imenske prostore ne može se koristiti ni reč php (ili PHP), niti bilo kakve složenice na bazi nje (kao npr. „PHP\Class“)[81]
pre prve primene imenskog prostora, neophodno je da sav ostali kod bude definisan u tom istom imenskom prostoru, što se obično čini upotrebom vitičastih zagrada {}
Dozvoljeno je koristiti više imenskih prostora u okviru istog programa[83], čak i iste datoteke[81], sa mogućnošću raspolaganja na globalnom nivou[83].
Izuzeci (engl.exceptions) su reakcije u sopstvenom kodu na određene događaje, za vreme izvršavanja programa, što zahteva poseban blok naredbi, kako bi takve situacije bile tretirane na odgovarajući način.[86] Konkretno za PHP, od verzije #-.7BPHP.7D- 5.0.[87] u tu svrhu se koriste objekti iz klase Exception ili bilo koje druge klase izvedene iz nje. Struktura osnovne klase ima sledeći izgled[87]:
Exception{/* Атрибути класе Exception*/protectedstring$message;// порука изузеткаprotectedint$code;// идентификациони број изузеткаprotectedstring$file;// датотека у којој је побуђен изузетакprotectedint$line;// линија у којој је искочио изузетак/* Методе класе Exception */public__construct([string$message=""[,int$code=0[,Exception$previous=NULL]]])finalpublicstringgetMessage(void)// Враћа поруку о изузетку, као знаковну променљиву (String)finalpublicExceptiongetPrevious(void)// враћа претходни објекат изузетка (класе Exception)finalpublicmixedgetCode(void)// враћа број изузеткаfinalpublicstringgetFile(void)//враћа датотеку у којој је искочио изузетакfinalpublicintgetLine(void)//враћа број линије у којој је искочио изузетакfinalpublicarraygetTrace(void)// враћа низ са стеком извршавања изузеткаfinalpublicstringgetTraceAsString(void)// враћа знаковну променљиву уместо низаpublicstring__toString(void)// изузетак представљен помоћу знаковне променљивеfinalprivatevoid__clone(void)// није дозвољено клонирање изузетака, метода враћа грешку}
Da bi se na pravi način tretirao izuzetak, objekat iz klase izuzetaka treba da raspolaže: porukom o razlogu izbacivanja Message, identifikacionim brojem ili kodom (engl.code) izuzetka, brojem linijskog koda (engl.line) i imenom datoteke (engl.file) u kojoj je izuzetak izbačen.[68]
Objekti, kao primerci izuzetaka su veoma korisni za ispitivanje ispravnosti programa. Pomoću njih se postiže da sve ostane pod kontrolom, tako što se program prilagodi nastaloj situaciji i nastavi dalje izvršavanje, čak i u slučaju da se desi nešto „loše“ u programu, odnosno ili dođe do neke greške.[68]
Kontrola mogućih grešaka vrši se pomoću struktura formiranih od ključnih rečitry{} i catch{}, gde svaka od njih obuhvata određeni blok naredbi, upisanih između vitičastih zagrada. Uz svaki blok try treba postaviti najmanje jedan, a može i više blokova catch. Više blokova catch piše kada postoje izuzeci iz različitih klasa izvedenih iz klaseException. Struktura try — catch mogla bi se prevesti na običan jezik sledećom rečenicom: „probaj blok try i ako se desi neki izuzetak, pređi na blok catch. U bloku catch definiše se šta je tačno potrebno uraditi u koliko dođe do izuzetka. Izuzetak može biti: pobuđen (engl.rаised), odnosno izbačen (engl.throwen), ili uhvaćen (engl.catched).[68] Ovo se postiže uz pomoć ključne reči throw. Njome se kreira konkretan objekat iz klase Exception. Obično se postavlja na početku bloka ili funkcije try, a može se upotrebiti i u bloku catch, jednom kada je izuzetak uhvaćen.
Postavljanjem ključne reči throw na početku bloka, sprečava se dalje izvršavanje naredbi u okviru tog bloka. Sledeći korak u izvršavanju je traženje bloka catch i ispitivanje uslova da li izuzetak pripada klasi, odnosno tipu koji je moguće kontrolisati u okviru tog bloka.
<?phpclassДиректоријумИзузетакextendsException{}classДатотекаИзузетакextendsException{}functionпровериДиректоријум($директоријум){if(!is_dir($директоријум))thrownewДиректоријумИзузетак("Погрешан директоријум:".$директоријум);}functionпровериДатотеку($датотека){if(!file_exists($датотека))thrownewДатотекаИзузетак("Не постоји датотека:".$датотека);}functionотвориДатотеку($директоријум,$датотека){провериДиректоријум($директоријум);провериДатотеку($директоријум.$датотека);thrownewException("Било која грешка");$фд=fopen($директоријум.$датотека,"a+");return$фд;}$директоријум="C:/proba/";$датотека="text.txt";try{$фд=отвориДатотеку($директоријум,$датотека);fclose($фд);}catch(ДиректоријумИзузетак$e)//ако не постоји директоријум{echo$e->getMessage();//штампа текст "Погрешан директоријум:C:/proba/"}catch(ДатотекаИзузетак$e)// ако не постоји датотека{echo$e->getMessage();// штампа текст "Не постоји датотека:C:/proba/text.txt"}catch(Exception$e){echo$e->getMessage();}?>
Kada se koriste različite klase izuzetaka, veoma je bitan redosled kojim se hvataju izuzeci. Prvo se navode konkretniji slučajevi pomoću izvedenih klasa (ДиректоријумИзузетак i ДатотекаИзузетак) , a kasnije idu generalniji slučajevi koristeći klasu bazu — Exception.
Ako se uslov za hvatanje ne ispuni, izuzetak biva izbačen, odnosno prosleđen na više roditeljske blokove, gde se očekuje da postoji kontrola. U slučaju da greška ne može da se uhvati ni na jednom nivou, dolazi do greške (engl.fatal error), koja zaustavlja izvršavanje skripte. Radi izbegavanja nekontrolisanih izuzetaka, može da se definiše upravljanje izuzecima uz pomoć funkcije set_exception_handler.[88] ili upravljanje greškama set_error_handler[89]
Podaci dobijeni uz pomoć funkcija za rukovanje izuzecima, odnosno greškama, mogu se na kontrolisan način prikazati korisniku na ekranu, registrovati u datoteci ili poslati preko elektronske pošte, pomoću funkcije error_log[90] ili pomoću istoimene opcije u konfiguracijskoj datoteci php.in[91] Vrste grešaka koje će se na ovaj način kontrolisati zavise od parametra error_reporting, dok se prikazivanje na ekranu može podesiti pomoću opcije display_errors, što je korisno prilikom proba i depuracije koda, ali se u krajnjoj verziji za klijenata radije preporučuje opcija log_errors, navođenje putanje registra u konfiguracijskoj datoteci php.ini.[91]
Upravljanje greškama uz pomoć izuzetaka dosta je jasnije i lakše od klasičnog načina, međutim, kao termin u PHP-u, on je još uvek nedovoljno razvijen, jer izuzeci nne iskaču automatski, ne generiše ih interpretator, za razliku od nekih drugih objektno-orijentisanih jezika, koji u tu svrhu pružaju daleko veće mogućnosti.[69]
Ključne reči (engl.keywords) su rezervisane reči. Imaju specijalno značenje i na raspolaganju su u bilo kom delu programa (skripte). One čine osnovu PHP jezika. Upotreba njihovih imena za definisanje sopstvenih promenljivih može dovesti do konfuzije. Ipak, mogu slobodno da se koriste kao imena korisničkih konstanti, funkcija, metoda, klasa i objekata. Sledi tabela osnovnih ključnih reči:[92]
Forma, formular ili obrazac (engl.form) je jedan od značajnih elemenata dinamičkog aspekta većine internet aplikacija, u kojima prikaz veb-stranice zavisi od korisničkih akcija. Međutim, forma je zapravo deo HTML strukture, za grupisanje različitih elemenata, čija je funkcija prikupljanje podataka od korisnika.[93] U zavisnosti od akcije korisnika, dobijena informacija se može proveriti kod korisnika, zatim se može poslati kao zahtev serveru, na ponovnu proveru i obradu podataka, a u zavisnosti od potrebe na kraju se može poslati i povratna informacija. Primer:
Forme su zapravo nevidljivi kontejneri postavljeni između oznaka za početak <form> i kraj </form>. Bitni atributi ove etikete su:
action — koja sadrži veb adresu na serveru na kojoj će se izvršiti obrada informacije dobijene iz formulara
method — kojom se definiše metoda za prenošenje podataka iz formulara. Postoje dve metode: GET i POST
Metoda GET se koristi ako se ne navede ni jedna metoda. Njome se informacija uneta u formular nadovezuje na veb adresu iz atributa action i ima sledeći oblik:
pri čemu treba voditi računa da postoje ograničenja za ukupnu dužinu veb adrese. Osim toga, ova metoda nije sigurna i ne može se koristiti za slanje lozinki i ostalih ličnih podataka korisnika.
Metoda POST prenosi informaciju na nešto sigurniji način, nema ograničenja u veličini informacije, a šalje se kao deo dokumenta u obliku ulaznog toka podataka, formirajući parove: име_поља1=вредност1&име_поља2=вредност2.[94]
Razvojni tim PHP-a se sastoji od nekoliko desetina programera, i još nekoliko desetina radnika koji rade na drugim projektima vezanim za PHP, kao što je PEAR i dokumentacija PHP-a. Pored ovoga, PHP-u su dobrovoljno doprinosili mnogi programeri širom sveta. Brz razvoj je prouzrokovao da PHP poseduje veliki broj biblioteka i funkcija, ali i problem nekonzistentnosti u imenovanju ugrađenih funkcija.
Sledi detaljan spisak mogućnosti koje PHP nudi kroz svoje biblioteke i dodatke:
PHP se može besplatno preuzeti širom Interneta i na zvaničnom sajtu PHP-a, a licenciran je PHP licencom, koja predviđa:[97][98]
Proizvodi koji se dobijaju iz ovog softvera ne smeju se nazvati "PHP", niti se sme "PHP" pojavljivati u njihovom imenu, bez prethodne pismene dozvole od group@php.net. Možete ukazati na to da vaš softver funkcioniše zajedno sa PHP-om govoreći "Foo za PHP" umjesto da ga zovete "PHP Foo" ili "phpfoo".
Ovo ograničenje upotrebe "PHP"-a čini licencu PHP nespojivom s Opštom javnom licencom, dok Zend licenca nije kompatibilna zbog reklamne klauzule slične onoj iz originalne BSD licence.[99]
^ abvgHansen, August; Hansen, Ogi (1991). Programiranje na jeziku C: Potpuni vodič za programski jezik C (2nd izd.). Dragon - Mikro knjiga. ISBN978-86-7555-016-7.