PHP (engl. Hypertext Preprocessor) specijalizovani je skriptni jezik prvenstveno namenjen za izradu dinamičnog veb sadržaja i izvodi se na strani servera.

PHP
PHP logotip
Izgovara sepe-ha-pe
Modelimperativni, objektno-orijentisan
Pojavio se1995. god.; pre 29 godina (1995)[1]
Autor(i)Rasmus Lerdorf
Dizajner(i)The PHP Group
Aktuelna verzija7.2.7[2]
Datum aktuelne verzije21. jun 2018. god.; pre 5 godina (2018-06-21)
Sistem tipovadinamički, slabi
UticajiC, Perl, Java, C++, C#, Pajton
Uticao naPhp4delphi, Falkon, Hak
Operativni sistemiViše-platformski
LicencaPHP licenca
Veb-sajtphp.net
Dokumentacijaphp.net/docs.php

Uvod uredi

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.).

Istorija uredi

PHP/FI uredi

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 uredi

PHP 3.0 je predstavljao prvu verziju koja dosta liči na današnje verzije PHP-a. Kreirali su ga izraelski programeri Zeev 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 rekurzivni akronim "PHP: preprocesor hiperteksta" (PHP: Hypertext Preprocessor).

PHP 3.0 je zvanično objavljen u junu 1998. nakon devet meseci korišćenja u probnoj fazi.

PHP 4.0 uredi

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.

PHP 5.0 uredi

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.

Verzija 5 je takođe donela mnoštvo izmena u objektno-orijentisanom programiranju.

PHP 7.0 uredi

Verzija 7.0 je izašla u decembru 2015. godine.

Upotreba uredi

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.

Način izvršenja uredi

 
Izvršavanje PHP skripte na veb-serveru

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

Struktura programa uredi

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]:

<?php

PHP наредбе

?>

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>

što predstavlja HTML kod spreman za prikaz u internet pregledaču.

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.

Osnovna sintaksa uredi

Komentari uredi

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.

<?php

echo ”Проба за једноредни коментар”; // Ово је једноредни коментар

/* Ово је коментар
                  исписан у два реда */

echo ”Још један једноредни коментар”; # Ово је једноредни коментар
 
?>

Promenljive uredi

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.

PHP ima sledeće tipove promenljivih:[10]

  • Osnovni tipovi promenljivih:
    • boolean — logičke vrednosti: tačno — true i netačno — false
    • integer — celi brojevi
    • float — realni brojevi sa pokretnom zapetom
    • string — niz (niska) znakova (simbola), odnosno tekst (literal)
  • Složeni tipovi promenljivih:
  • Posebni tipovi promenljivih:
    • 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.

Korisne funkcije uredi

Za ispisivanje promenljivih na standardni izlaz koriste se dve osnovne funkcije:

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)
?>

Ispitivanje tipa promenljivih uredi

Za ispitivanje tipa promenljivih mogu se koristiti funkcije iz tabele:

Ispitivanje tipa promenljivih
funkcija ispituje da li je
is_array promenljiva niz
is_double, is_float, is_real promenljiva u formatu sa pokretnom zapetom
is_long, is_int, is_integer promenljiva ceo broj
is_string promenljiva znakovni niz
is_object promenljiva objekat
is_resource promenljiva resurs
is_null promenljiva ima vrednost null
is_scalar promenljiva skalarnog tipa: numerički, logički ili znakovni podatak
is_numeric promenljiva broj ili znakovni niz koji se može pretvoriti u broj
is_callable vrednost promenljive ime postojeće funkcije

Konstante uredi

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:

define("НАЗИВ_КОНСТАНТЕ_ВЕЛИКИМ_СЛОВИМА", вредност [, осетљивост_на_мала_и_велика_слова]);

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:

<?php

define("KONST_BAZA_PODATAKA", "mysql");
echo KONST_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.

<?php

define(”MIN_VREDNOST”, "0.0"); // Правилно дефинисање константе ван класе
define(”MAX_VREDNOST”, "1.0"); // Правилно дефинисање константе ван класе

//const MIN_VREDNOST = 0.0; Неправилно дефинисање константе ван класе
//const MAX_VREDNOST = 1.0; Неправилно дефинисање константе ван класе

class ClasaKonstanta
{
    //define(”MIN_VREDNOST”, ”0.0”);        Неправилно дефинисање константе у оквиру класе није дозвољен
    //define(”MAX_VREDNOST”, ”0.0”);        Неправилно дефинисање константе у оквиру класе није дозвољен
  
    const MIN_VREDNOST = 0.0;            // Правилан начин за дефинисање константе унутар класе
    const MAX_VREDNOST = 1.0;            // Правилан начин за дефинисање константе унутар класе

    public static function getMinVrednost()
    {
        return self::MIN_VREDNOST;
    }
    public static function getMaxVrednost()
    {
        return self::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.

Izrazi uredi

Izrazi (engl. еxpressions) su jedan od osnovnih pojmova svakog višeg programskog jezika,[21] pa i PHP-a.[22] Izraz računa i daje rezultat ili uzrokuje neku aktivnost (zvanu bočni efekat). To su kombinacije operatora i operanda.[23] Jednostavnije rečeno, izraz je sve ono što ima neku vrednost.[21] Vrednost nekog izraza određuje se na osnovu sintakse izraza, odnosno pravila prvenstva svakog od operatora u izrazu i asocijativnosti.[23]

Operatori uredi

Operatori su simboli koji omogućavaju izvršavanje operacija nad vrednostima i promenljivama. Mogu imati jedan, dva ili više argumenata. Postoje[6]:

  • aritmetički operatori: sabiranje (+), oduzimanje (-), množenje (*), deljenje (/), modulo (%).
  • 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.
Logički operatori
operator naziv upotreba rezultat
! negacija !$a izraz tačan ako je $a netačno
&& konjunkcija $a && $b tačan ako su $a i $b tačni
|| disjunkcija $a $b tačan ako je $a ili $b tačno
  • 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
<< pomeranje bitova ulevo $a << $b pomera bitove u $a ulevo za $b mesta
>> pomeranje bitova udesno $a >> $b pomera bitove u $a udesno za $b mesta
  • uslovni operator ima sledeći oblik[24]:

(услов) ? (израз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

Prioritet operatora uredi

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:

  1. deljenje 7/2 i dobiće se rezultat 3.5
  2. množenje 2*3 i dobiće se rezultat 6
  3. rezultati prve dve operacije će se sabrati i dobiće se rezultat 9.5
  4. ovaj rezultat dodeliće se promenljivoj $x
Asocijativnost operatora uredi

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:

  1. deljenje 6/2 i dobiće se rezultat 3
  2. 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:

  1. dodela vrednosti $c, što je 2, promenljivoj $b i dobiće se rezultat 2
  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:

$a == $b && $b == $c

Naredbe uredi

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]

Upravljačke strukture uredi

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.

Uslovno grananje uredi

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]

<?php

if (условни_израз_1)
{
    блок_наредби_1;
}
elseif (условни_израз_2)
{
    блок_наредби_2;
}

/*... */

elseif (условни_израз_н)
{
    блок_наредби_н;
}
else
{
    последњи_блок_наредби;
}

?>

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:

<?php

if ($godina_rodjenja < 1992) echo "ради се о пунолетној особи";

/*
   или у 2 реда, ради боље прегледности:
*/

if ($godina_rodjenja < 1992)
    echo "ради се о пунолетној особи";

?>

Višesmerno grananje uredi

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:

<?php

switch (израз)
{
    case "вредност_1":
          блок_наредби_1;
    case "вредност_2":
          блок_наредби_2;

    /*... */

    case "вредност_н"
          блок_наредби_н;
    default:
          последњи_блок_наредби;
}

?>

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:

<?php

switch ($dan)
{
    case 1:
          $rezultat = "понедељак";
          break;
    case 2:
          $rezultat = "уторак";
          break;
    case 3:
          $rezultat = "среда";
          break;
    case 4:
          $rezultat = "четвртак";
          break;
    case 5:
          $rezultat = "петак";
          break;
    default:
          $rezultat = "викенд";
}

?>

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:

<?php

if ($dan == 1)
    $rezultat = "понедељак";

elseif ($dan == 2)
    $rezultat = "уторак";

elseif ($dan == 3)
    $rezultat = "среда";

elseif ($dan == 4)
    $rezultat = "четвртак";

elseif ($dan == 5)
    $rezultat = "петак";

else
    $rezultat = "викенд";

?>

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.:

<?php

switch ($dan)
{
    case 1:
          $rezultat = "понедељак";
    case 2:
          $rezultat = "уторак";
    case 3:
          $rezultat = "среда";
    case 4:
          $rezultat = "четвртак";
    case 5:
          $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: <

<?php

switch ($slovo)
{
    case "a":
    case "А":
            $rezultat = "слово а";       // резултат ће бити "слово а",  када је $slovo == "a" и када је $slovo == "A"
            break;
    case "б":
    case "B":
            $rezultat = "слово б"; 
            break;                        // резултат ће бити "слово б",  када је $slovo == "б" и када је $slovo == "Б"
   }

?>

Petlje uredi

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“ uredi

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]:

<?php

while (условни_израз)
{
    блок_наредби;
}

?>

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 do-while uredi

Specijalan slučaj petlje „dokle god“ (engl. do-while) sa uslovom koji se ispituje na kraju svake iteracije, ima sledeći oblik:

<?php

do
{
    блок_наредби;
}
while (условни_израз)

?>

Blok naredbi će se izvršiti makar jednom, čak i kada uslov nije ispunjen ni u prvoj iteraciji. Primer:

<?php

$i = 9;
do
{
    echo $i; // исписује бројеве од 0 до 9 (уназад)
    $i--;
}
while ($i >= 0);

?>
Petlja for uredi

Petlja for je najsloženiji tip petlji.[34] Može da se koristi kada je broj iteracija unapred poznat.[31] Ima sledeći oblik:

<?php

for (израз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“ uredi

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]:

<?php

foreach (низ 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:

<?php

foreach (низ as индекс => вредност)
{
    блок_наредби;
}

?>

Gde se osim vrednosti elementa koristi i promenljiva za smeštanje vrednosti indeksa (ključa) svakog od elemenata niza.

Beskonačne petlje uredi

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]

wile for
<?php
while(1)
{ 
  print "у петљи while\n"
}
?>

<?php
for (;;)
{
 print "у петљи for\n"
}
?>

Alternativna sintaksa uredi

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
<?php
if ($a > 0) {
    echo "a има позитивну вредност";
} elseif ($a == 0) {
    echo "a је нула";
} else {
    echo "а има негативну вредност";
}
?>
<?php
if ($a > 0):
    echo "a има позитивну вредност";
elseif ($a == 0):
    echo "a је нула";
else:
    echo "а има негативну вредност";
endif;
?>

Nizovi uredi

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]; // збир ће имати вредност 210
echo $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 ($hrana as $kljuc => $vrednost)
{
    echo "$kljuc = $vrednost<br />"; /*    на излазу приказује "доручак = сендвич 
                                                                ручак = мусака
                                                                вечера = јабука"      */
}
                 
?>
Operatori za rad sa nizovima[6][39]
operator naziv upotreba značenje
+ unija $a + $b 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
array_unique() uklanja duplikate iz navedenog niza

Višedimenzionalni nizovi uredi

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]

<?php
$picha = array("кафа", "чај", "сок");
list($piche1, $piche2, $piche3) = $piche; // додељује вредности:
                                          // $piche1 = "кафа", $piche2 = "чај" $piche3 = "сок"
list( , , $moje_piche) = $piche; // додељује вредност $moje_piche = ”сок”
?>

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 uredi

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či function, na sledeći način:

function име_функције(листа_параметара)
{
    блок наредби;
}

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)
    {
        return 1;
    }
    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:

<?php
function моја_функција()
{
    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:
<?php
function моја_функција()
{
    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:

<?php
function функција_увећања()
{
   static $стат = 8;
   $стат = $стат + 6;               // 1. позив $стат = 14, 2. позив $стат = 20, 3. позив $стат = 26
}
?>

Upravljanje datotekama uredi

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]:

$фд = fopen( $име_датотеке”, $начин_приступања [, $користити_путању_за_спољашње_датотеке = false [, $ресурс]] );

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:

  • liniju po liniju, pomoću funkcije fgets[53]:

fgets ( resource $фд [, $број_бајтова ] )

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:

fclose ( $фд );

Primer:

<?php

$фд= fopen("datoteka.txt", "r");
if ($фд) {
    while ( !feof($фд)) {
        $линија = fgets($фд);
    }
    if (!feof($фд)) {
        echo "грешкаl\n";
    }
    fclose($фд);
}

?>

Spoljašnje datoteke uredi

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:

include("путања/име_спољашње_датотеке");
require("путања/име_спољашње_датотеке");
include_once("путања/име_спољашње_датотеке");
require_once("путања/име_спољашње_датотеке");

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.

<html>
<head>
<title> Заглавље </title>

</head>
<body>

Datoteka za podnožje (podnozje.php) stranice ima sledeći sadržaj:

</body>
</html>

A telo stranice (telo.php):

<?php
include("zaglavlje.php");
echo "Ово је садржај тела странице.";
php include("podnozje.php");
?>

Na izlazu će se kao rezultat dobiti:

<html>
<head>
<title> Заглавље </title>

</head>
<body>
Ово је садржај тела странице.
</body>
</html>

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.

Klase i objekti uredi

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]:

class име_класе {

  //дефиниције атрибута
  [

     public | private | protected | $атрибут [= израз];

     ....
  ]

  //дефиниције метода
  [

     [public | private | protected]  function метода {

       ...
     }

   ...
  ]
}

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]:

име_објекта->име_атрибута;

име_објекта->име_методе();

Treba imati na umu da se $this ne može upotrebiti van klase, jer inače daje grešku.

Specijalne metode klase uredi

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:

$објекат = new име_класе();

$клонирани_објекат = 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:

class Корисник
{
  private $broj;
  private $ime;
  private $prezime;
  
  function getBroj(){
    return $this->broj;
  }
  function setBroj($broj){
    $this->broj = $broj;
  }
  function getIme(){
    return $this->ime;
  }
  function setIme($ime){
    $this->ime = $ime;
  }
  function getPrezime(){
    return $this->prezime;
  }
 function setPrezime($prezime){
    $this->prezime = $prezime;
 }
}

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:

public function __get($atribut) {
    switch ($atribut) {
      case "":
          return "";
      default:
        return $this->$atrb;
    }
}

public function __set($atribut, $vrednost) {
    switch ($atribut) {
      case "":
          return "";
      default:
        $this->$atribut = $vrednost;
    }
}

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]

<?php
class Тест{
  protected елементи = array();
  public function __get($парам){
     if array_key_exists($парам, $this->елементи){
       return ($this->елементи[$парам]);
     }
     else {
        return ("не постоји атрибут");
     }
  }
  public function __set($кључ, $вредност)
  {
    $this->елементи[$кључ] = $вредност;
  }
  public function __isset($парам)
  {
     return (isset($this->елемент[$парам]));
  }
}

$објекат = new Тест();
print $објекат->брзина; // ”не постоји елемент”, јер још увек није постављена вредност
$објекат->брзина = ”55”;
if (emtpy($objekat->брзина))
{
  echo "атрибут брзина је постављен”;
}
$објекат->брзина = null;
if (emtpy($objekat->брзина))
{
  echo "Такође позива методу __isset”; // мада је вредност атрибута празна (null) атрибут је дефинисан
}

?>

Nasleđivanje uredi

 
Različiti načini jednostrukog nasleđivanja klasa

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
<?php
class Запослени
{
   private $име;
   protected $плата;
   private $датум_запослења;
   public function __construct($име, $плата, $датум)
   {
     $this->име = $име;
     $this->плата = $плата;
     $this->датум_запослења = $датум;
   }
   public function рачунаПлату()
   {
      return $this->плата;
   }
}
class Продавац extends Запослени
{
   private $продато;
   private $провизија;
   public function __construct($име, $плата, $датум, $провизија)
   {
     parent::__construct($име, $плата, $датум);
     $this->продато = 0;
     $this->провизија = $провизија;
   }
   public function продаја($количина)
   {
     $this->продато = $this->продато + $количина;
   }
   public function рачунаПлату()
   {
     return ($this->плата + ($this->продато * $this->провизија / 100));
   }
}
 $марко = new Запослени("Марко Краљевић", 56000, "10/04/2010");
 $ана = new Продавац("Ана Бркић", 40000, "21/02/2012", 50);
 $маркова_плата = $марко->рачунаПлату();
 $ана->продаја (1000);
 $анина_плата = $ана->рачунаПлату();
 
 echo "<p>Маркова плата је $маркова_плата</p>"; //Маркова плата је 56000
 echo "<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]:

<?php
class КласаРодитељ
{
}

class КласаДете extends КласаРодитељ
{
}
$објекат = new КласаДете;
var_dump($a instanceof КласаДете); // тачно boolean(true)
var_dump($a instanceof КласаРодитељ); // тачно boolean(true)
?>

Apstraktne klase uredi

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]

abrstract class АпстрактнаКласа{

   abstract protected function обавезнаМетода1();

   abstract protected function обавезнаМетода2();
...
}

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 uredi

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.

interface име_интерфејса()
{
  //дефиниције метода

  [public] function метода();

  ...
}

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.

class име_класе implements име_интерфјеса1, име_интерфејса2 ...{
...
}

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 uredi

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 uredi

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*/
protected string $message ; // порука изузетка

protected int $code ; // идентификациони број изузетка

protected string $file ; // датотека у којој је побуђен изузетак

protected int $line ; // линија у којој је искочио изузетак

/* Методе класе Exception */

public __construct ([ string $message = "" [, int $code = 0 [, Exception $previous = NULL ]]] )

final public string getMessage ( void ) // Враћа поруку о изузетку, као знаковну променљиву (String)

final public Exception getPrevious ( void ) // враћа претходни објекат изузетка (класе Exception)

final public mixed getCode ( void ) // враћа број изузетка

final public string getFile ( void ) //враћа датотеку у којој је искочио изузетак

final public int getLine ( void ) //враћа број линије у којој је искочио изузетак

final public array getTrace ( void ) // враћа низ са стеком извршавања изузетка

final public string getTraceAsString ( void ) // враћа знаковну променљиву уместо низа

public string __toString ( void ) // изузетак представљен помоћу знаковне променљиве

final private void __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či try{} 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.

<?php
class ДиректоријумИзузетак extends Exception {}
class ДатотекаИзузетак extends Exception {}
function провериДиректоријум($директоријум)
{
   if (!is_dir($директоријум))
      throw new ДиректоријумИзузетак("Погрешан директоријум:" . $директоријум);
}
function провериДатотеку($датотека)
{
       if(!file_exists($датотека))
         throw new ДатотекаИзузетак("Не постоји датотека:" . $датотека);
 
}
function отвориДатотеку($директоријум, $датотека)
{
   провериДиректоријум($директоријум);
   провериДатотеку($директоријум . $датотека);
   throw new Exception("Било која грешка");
   $фд = 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 uredi

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]

Ključne reči
ključna reč opis
__halt_compiler() Zaustavlja izvršenje kompajlera
abstract definiše apstraktne klase i metode
and logički operator nižeg prioriteta
array() kreira niz
as koristi se u petlji foreach za numeričke ili asocijativne nizove
break prekida izvršavanje aktuelne strukture u petljama for, foreach, while, do-while ili switch
callable
case koristi se kao uslov u strukturi switch
catch koristi se kao klauzula bloka try
class definiše klasu
clone kreira kopiju objekta
const definiše konstantu na lokalnom nivou
constant() vraća vrednost prethodno definisane konstante
continue nastavlja izvršavanje na kraj petlje
declare
default podrazumevana klauzula bloka strukturi switch
define definiše konstante na globalnom nivou
defined() proverava da li je definisana konstanta
die() isto što i exit()
do klauzula petlje do-while
echo šalje promenljive na standardni izlaz
else klauzula kontrolne strukture if
elseif klauzula kontrolne strukture if
empty() utvrđuje da je promenljiva bez dodeljene vrednosti (null), obrnuto od isset()
enddeclare
endfor završetak petlje for u drugoj sintaksi
endforeach završetak petlje foreach u drugoj sintaksi
endif završetak kontrolne strukture if u drugoj sintaksi
endswitch završetak kontrolne strukture switch u drugoj sintaksi
endwhile završetak petlje while u drugoj sintaksi
eval() procenjuje da li promenljiva znakovnog tipa predstavlja PHP koda
exit() zaustavlja izvršavanje skripte, isto što i die()
extends definiše roditeljsku klasu aktuelnoj klasi
final u deklaraciji da označi kao klasu ili metodu koja ne može da se nasledi
for petlja
foreach petlja
function definiše korisničku funkciju
global globalna promenljiva
goto skače na drugi deo programa, ciljna tačka je navedena labelom praćenom dvotačkom
if kontrolna struktura
implements upotreba interfejsa u klasi
include korišćenje spoljašnje datoteke
include_once korišćenje spoljašnje datoteke sa jednom deklaracijom
instanceof operator koji utvrđuje da li je neki objekat primerak određene klase ili nasleđene klase
insteadof
interface deklariše interfejs
isset() proverava da li promenljiva ima dodeljenu vrednost, suprotno od isempty()
list() dodeljuje vrednosti niza promenljivama iz liste argumenata
namespace deklariše imenski prostor
new kreira novi objekat prema modelu klase
or klauzula naredbe if
print šalje promenljivu na izlaz
private deklariše atribut ili metodu dostupnu unutar jedne klase
protected deklariše atribut ili metodu dostupnu unutar jedne klase i svih klasa izvedenih od nje
public deklariše javni atribut ili klasu
require korišćenje spoljašnje datoteke
require_once korišćenje spoljašnje datoteke sa jednom deklaracijom
return povratak iz korisničke funkcije
static deklariše promenljive i funkcije koje ne menjaju vrednost između poziva
switch struktura za višesmerno grananje
throw ispaljuje izuzetak
trait
try blok koda za hvatanje izuzetaka
unset() poništava prethodno dodeljenu vrednost promenljivoj ili klasi
use korišćene imenskog prostora
var deklariše javni atribut (promenljivu) klase
while petlja
xor logički operator nižeg prioriteta

Rad sa formama uredi

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:

 
Primer HTML stranice sa ugrađenim formularom
<!DOCTYPE html>
<html lang="mul" dir="ltr">
    <head>
        <meta charset="utf-8" />
        <title>Википедија</title>
    </head>
    <body>
        <div style="margin-left: 80px;">
            <img src="http://upload.wikimedia.org/wikipedia/sr/b/bc/Wiki.png" alt="Википедија" />
        </div>
        <div class="central-featured-lang lang1" lang="sr">
            <a href="http://sr.wikipedia.org/" title = "Српски — Википедија — слободна енциклопедија" 
                 style="margin-left: 115px;">
                <strong>Српски</strong>

                <em style="margin-left: 60px;">Слободна енциклопедија</em>

                <small style="margin-left: 95px;">170 000+ чланака</small>
            </a>
        </div>
        <form action="http://www.wikipedia.org/search-redirect.php">
            <input type="hidden" name="family" value="wikipedia" />
            <input id="searchInput" name="search" type="search" size="20" 
                       autofocus="autofocus" accesskey="F" />
            <select id="searchLanguage" name="language">
                <option value="sr" lang="sr" selected="selected">Српски / Srpski</option>
                <option value="es" lang="es">Español</option>
                <option value="ru" lang="ru">Русский</option>
                <option value="en" lang="en">English</option>
            </select>
            <input class="formBtn" type="submit" value="  ⇒  " name="go" style="margin-top: 20px;" />
            <input type="hidden" value="Go" name="go" />
        </form>
    </body>
</html>

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:

http://веб_адреса?име_поља1=вредност1&име_поља2=вредност2 ...

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]

Tehničke mogućnosti uredi

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:

Kompatibilnost uredi

PHP je podržan u većini popularnih operativnih sistema, uključujući Juniks, Linuks, Microsoft Windows i Mek OS.[95][96]

Dostupnost i licenca uredi

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]

Izvori uredi

  1. ^ Lerdorf, Rasmus (26. 4. 2007). „PHP on Hormones – history of PHP presentation by Rasmus Lerdorf given at the MySQL Conference in Santa Clara, California”. The Conversations Network. Arhivirano iz originala 06. 01. 2019. g. Pristupljeno 11. 12. 2009. 
  2. ^ „News Archive – 2016: PHP 7.0.13 Released”. php.net. 10. 11. 2016. Pristupljeno 10. 11. 2016. 
  3. ^ a b v PHP.NET, "Istorija PHP-a"
  4. ^ USENET, "Announce: Personal Home Page Tools"
  5. ^ „Nexen.net, "PHP statistika". Arhivirano iz originala 20. 08. 2007. g. Pristupljeno 28. 08. 2007. 
  6. ^ a b v g d đ Welling, Luke; Thomson, Laura (2009). PHP (PDF). ISBN 978-86-7555-340-3. 
  7. ^ PHP.net: New features, 9. novembar 2012, pristup 13. novembar 2012 Arhivirano na sajtu Wayback Machine (2. oktobar 2012)(jezik: engleski)
  8. ^ a b Link grup, materijali: PHP programski jezik, prvi deo, pristup 27. oktobar 2012
  9. ^ „PHP.net: Basics, 2. novembar 2012, pristup 5. novembar 2012”. Arhivirano iz originala 19. 03. 2014. g. Pristupljeno 05. 11. 2012. 
  10. ^ „PHP.net: Introduction, 20. avgust 2011, 7. novembar 2012”. Arhivirano iz originala 04. 02. 2014. g. Pristupljeno 05. 11. 2012. 
  11. ^ PHP.net: print, 26. oktobar 2012, pristup 29. oktobar 2012
  12. ^ PHP.net: echo, 26. oktobar 2012, pristup 29. oktobar 2012
  13. ^ „PHP.net: empty, 20. avgust 2011, pristup 13. novembar 2012”. Arhivirano iz originala 01. 11. 2013. g. Pristupljeno 13. 11. 2012. 
  14. ^ „PHP.net: isset, 20. avgust 2011, pristup 13. novembar 2012”. Arhivirano iz originala 21. 07. 2014. g. Pristupljeno 13. 11. 2012. 
  15. ^ „PHP.net: unset 9. novembar 2012, pristup 13. novembar 2012”. Arhivirano iz originala 27. 10. 2013. g. Pristupljeno 13. 11. 2012. 
  16. ^ „PHP.net var_dump, 20. avgust 2011, pristup 13. novembar 2012”. Arhivirano iz originala 07. 11. 2013. g. Pristupljeno 13. 11. 2012. 
  17. ^ a b v g d đ e ž z i j k l lj m n Heurtel 2011, str. 147
  18. ^ „PHP: constant - Manual”. www.php.net. Pristupljeno 19. 1. 2021. 
  19. ^ „PHP.net: get_defined_constants, 20. avgust 2011, pristup 28. oktobar 2012”. Arhivirano iz originala 18. 06. 2014. g. Pristupljeno 15. 11. 2012. 
  20. ^ „PHP.net: Predefinisane konstante, 20. avgust 2011, pristup 29. oktobar 2012”. Arhivirano iz originala 21. 07. 2014. g. Pristupljeno 29. 10. 2012. 
  21. ^ a b Krstarica: PHP — Izrazi (expressions), 23. jun 2001[mrtva veza]
  22. ^ „PHP.net: Expressions, 20. avgust 2011, pristup 28. oktobar 2012”. Arhivirano iz originala 21. 07. 2014. g. Pristupljeno 15. 11. 2012. 
  23. ^ a b v g Hansen, August; Hansen, Ogi (1991). Programiranje na jeziku C: Potpuni vodič za programski jezik C (2nd izd.). Dragon - Mikro knjiga. ISBN 978-86-7555-016-7. 
  24. ^ a b v g Cobo 2005
  25. ^ „PHP.net : php_errormsg, 20. avgust 2011, pristup 4. novembar 2012”. Arhivirano iz originala 04. 07. 2013. g. Pristupljeno 04. 11. 2012. 
  26. ^ „PHP.net: Operator izvršenja, 20. avgust 2011, pristup 4. novembar 2012”. Arhivirano iz originala 21. 07. 2014. g. Pristupljeno 04. 11. 2012. 
  27. ^ „PHP.net: shell-exec, 20. avgust 2011, pristup 4. novembar 2012”. Arhivirano iz originala 21. 07. 2014. g. Pristupljeno 04. 11. 2012. 
  28. ^ a b „PHP.net: Prioritet operatora, 20. avgust 2011, pristup 4. novembar 2012”. Arhivirano iz originala 11. 09. 2012. g. Pristupljeno 04. 11. 2012. 
  29. ^ „PHP.net: Kontrolne strukture — Uvod, 20. avgust 2012, pristup 27. oktobar 2012”. Arhivirano iz originala 14. 05. 2014. g. Pristupljeno 27. 10. 2012. 
  30. ^ PHP.net: elseif/else if, 20. avgust 2011, pristup 27. oktobar 2012 Arhivirano na sajtu Wayback Machine (31. oktobar 2013)(jezik: engleski)(jezik: srpski)
  31. ^ a b v Link grup, materijali: Strukture za kontrolisanje toka, pristup 28. oktobar 2012
  32. ^ „PHP.net: switch, 20. avgust 2011, pristup 28. oktobar 2012”. Arhivirano iz originala 14. 07. 2014. g. Pristupljeno 15. 11. 2012. 
  33. ^ „PHP.net: while, 20. avgust 2011, pristup 28. oktobar 2012”. Arhivirano iz originala 21. 07. 2014. g. Pristupljeno 15. 11. 2012. 
  34. ^ „PHP.net: for, 20. avgust 2012, pristup 28. oktobar 2012”. Arhivirano iz originala 13. 05. 2014. g. Pristupljeno 15. 11. 2012. 
  35. ^ „PHP.net: foreach, 20. avgust 2012, pristup 28. oktobar 2012”. Arhivirano iz originala 15. 04. 2012. g. Pristupljeno 15. 11. 2012. 
  36. ^ a b Hudson 2005
  37. ^ IMI PMF Kragujevac: Materijal za vežbe iz Veb programiranja, pristup 25. oktobar 2012
  38. ^ a b „PHP.net arrays, 20. avgust 2011, pristup 28. oktobar 2012”. Arhivirano iz originala 12. 09. 2012. g. Pristupljeno 29. 10. 2012. 
  39. ^ PHP.net: Operatori za nizove, 20. avgust 2012, pristup 8. novembar 2012
  40. ^ a b v g d „ETF predavanja: Internet programiranje PHP, Prof dr Boško Nikolić, pristup 28. oktobar 2012” (PDF). Arhivirano iz originala (PDF) 6. 9. 2012. g. Pristupljeno 29. 10. 2012. 
  41. ^ „Bubaj: Višedimenzionalni asocijativni nizovi, 28. oktobar 2012”. Arhivirano iz originala 05. 03. 2016. g. Pristupljeno 29. 10. 2012. 
  42. ^ PHP.net: list, 26. oktobar 2012, pristup 28. oktobar 2012
  43. ^ PHP.net: array_fill, 26. oktobar 2012, pristup 28. oktobar 2012
  44. ^ a b Atkinson, Leon; Suraski, Zeev (2004). Core PHP Programming. Prentice Hall Professional. ISBN 978-0-13-046346-3. 
  45. ^ a b v g Ullman 2009
  46. ^ a b v Welling & Thomson 2003
  47. ^ MDSN Visual Studio 2005: Diferencias entre parámetros y argumentos, pristup 30. novembar 2012(jezik: španski)
  48. ^ a b „PHP.net: Variable scope, 20. avgust 2011, pristup 5. novembar 2012”. Arhivirano iz originala 19. 03. 2014. g. Pristupljeno 05. 11. 2012. 
  49. ^ „PHP.net: Funkcije fajl-sistema, 20. avgust 2011, pristup 8. novembar 2012”. Arhivirano iz originala 06. 08. 2013. g. Pristupljeno 09. 11. 2012. 
  50. ^ Glosbe rečnik: File Set Descriptor, pristup 8. novembar 2012
  51. ^ „fopen, 20. avgust 2011, pristup 8. novembar 2012”. Arhivirano iz originala 05. 08. 2013. g. Pristupljeno 09. 11. 2012. 
  52. ^ „PHP.net: Podržani protokoli i omotači, 20. avgust 2011, pristup 8. novembar 2012”. Arhivirano iz originala 07. 08. 2013. g. Pristupljeno 09. 11. 2012. 
  53. ^ „PHP.net: fgets, 20. avgust 2011, pristup 9. novembar 2012”. Arhivirano iz originala 07. 08. 2013. g. Pristupljeno 09. 11. 2012. 
  54. ^ „PHP.net: file, 20. avgust 2011, pristup 9. novembar 2012”. Arhivirano iz originala 04. 07. 2013. g. Pristupljeno 09. 11. 2012. 
  55. ^ „file_get_contents, 20. avgust 2012, pristup 9. novembar 2012”. Arhivirano iz originala 02. 07. 2013. g. Pristupljeno 09. 11. 2012. 
  56. ^ w3schools: PHP Include Files, pristup 30. oktobar 2012 Arhivirano na sajtu Wayback Machine (13. novembar 2012)(jezik: engleski)
  57. ^ a b Lurig 2008
  58. ^ „learnphponline, PHP Include Tutorial, pristup 30. oktobar 2012”. Arhivirano iz originala 13. 11. 2012. g. Pristupljeno 30. 10. 2012. 
  59. ^ „PHP.net: ini.include-path, 20. avgust 2012, pristup 30. oktobar 2012”. Arhivirano iz originala 19. 04. 2013. g. Pristupljeno 30. 10. 2012. 
  60. ^ a b v g d Davis, Michele E.; Phillips, Jon A. (2007). Learning PHP & MySQL: Step-by-Step Guide to Creating Database-Driven Web Sites. "O'Reilly Media, Inc.". ISBN 978-0-596-55165-0. 
  61. ^ Crista lab: Cómo usar include y require en PHP, pristup 31. oktobar2012
  62. ^ a b v Krstarica: Klase i objekti, 24. jul 2012, pristup 31. oktobar 2012[mrtva veza]
  63. ^ „FON-predavanja: Osnovni koncepti Jave, dr Siniša Vlajić, prof. dr Vidojko Ćirić, dipl. inž. Dušan Savić, Beograd (2003)”. Arhivirano iz originala 16. 06. 2013. g. Pristupljeno 1. 11. 2012. 
  64. ^ a b v g d đ e ž z Link grup, materijal: Objektno-orijentisano programiranje u PHP-u, pristup 31. oktobar 2012
  65. ^ „PHP.net: Object Cloning, 20. avgust 2011, pristup 1. novembar 2012”. Arhivirano iz originala 19. 03. 2014. g. Pristupljeno 01. 11. 2012. 
  66. ^ „Linux hispano: Cursos PHP orientado a objetos – Crear una clase (atributos y propiedades, 12. jun 2011, pristup 4. novembar 2012”. Arhivirano iz originala 04. 02. 2013. g. Pristupljeno 04. 11. 2012. 
  67. ^ „PHP.net Overloading, 20. avgust 2012, pristup 4. novembar 2012”. Arhivirano iz originala 21. 07. 2014. g. Pristupljeno 04. 11. 2012. 
  68. ^ a b v g d đ e ž z Gogala, Mladen; MacIntyre, Peter; Danchilla, Brian (2011). Pro PHP Programming. Apress. ISBN 978-1-4302-3560-6. 
  69. ^ a b Computer Aided Education S.A: Programación páginas web con PHP material Herencia(jezik: španski)
  70. ^ a b PHP OOP — Inheritance, class extends, Courses web: PHP OOP — Inheritance, class extends, pristup 2. novembar 2012
  71. ^ „PHP.net: Final Keyword, 20. avgust 2011, pristup 2. novembar 2012”. Arhivirano iz originala 19. 03. 2014. g. Pristupljeno 16. 11. 2012. 
  72. ^ a b Horstmann, Cay S.; Cornell, Gary (2007). Java 2: Osnove. I (7th izd.). Beograd: CET. ISBN 978-86-7991-288-6. 
  73. ^ a b „PHP.net Object Inheritance, 20. avgust 2011, pristup 2. novembar 2012”. Arhivirano iz originala 21. 07. 2014. g. Pristupljeno 02. 11. 2012. 
  74. ^ „PHP.net: parent, 20. avgust 2011, pristup 6. novembar 2012”. Arhivirano iz originala 03. 01. 2014. g. Pristupljeno 06. 11. 2012. 
  75. ^ „PHP.net: Operator za tipove, 20. avgust 2011, pristup 7. novembar 2012”. Arhivirano iz originala 11. 09. 2012. g. Pristupljeno 07. 11. 2012. 
  76. ^ Trachtenberg 2004, str. 32.
  77. ^ Desarrolo web: Métodos y clases abstractos en PHP 5, 1. avgust 2005, pristup 7. novembar 2012(jezik: španski)
  78. ^ „PHP.net: Class Abstraction, 20. avgust 2011, pristup 7. novembar 2012”. Arhivirano iz originala 21. 07. 2014. g. Pristupljeno 07. 11. 2012. 
  79. ^ a b v „PHP.net: Object Interfaces, 20. avgust 2011, pristup 7. novembar 2012”. Arhivirano iz originala 21. 07. 2014. g. Pristupljeno 08. 11. 2012. 
  80. ^ Desarrollo web: Interfaces en PHP 5, 10. oktobar 2005, pristup 7. novembar 2012
  81. ^ a b v PHP.net: Namespaces overview, 16. novembar 2012, pristup 17. novembar 2012(jezik: engleski)
  82. ^ baluart.net: Los namespaces de PHP 5.3, una buena forma de tener un código más limpio y organizado, 4 Marzo 2011, pristup 17. novembar 2012 Arhivirano na sajtu Wayback Machine (27. novembar 2012)(jezik: španski)
  83. ^ a b v g MacIntyre 2010, str. 120
  84. ^ „PHP.net: Defining namespaces, 20. avgust 2011, pristup 17. novembar 2012”. Arhivirano iz originala 21. 07. 2014. g. Pristupljeno 17. 11. 2012. 
  85. ^ „PHP.net: declare, 20. avgust 2011, pristup 17. novembar 2012”. Arhivirano iz originala 21. 07. 2014. g. Pristupljeno 17. 11. 2012. 
  86. ^ Desarrollo: Manejo de excepciones en PHP, 16. decembar 2011, pristup 11. novembar 2012 Arhivirano na sajtu Wayback Machine (5. novembar 2012)(jezik: španski)
  87. ^ a b „Exceptions, 20. novembar 2011, pristup 11. novembar 2012”. Arhivirano iz originala 19. 03. 2014. g. Pristupljeno 13. 11. 2012. 
  88. ^ „PHP.net: set_exception_handler, 20. avgust 2011, pristup 15. novembar 2012”. Arhivirano iz originala 21. 07. 2014. g. Pristupljeno 16. 11. 2012. 
  89. ^ „PHP.net: set_error_handler, 20. avgust 2011, pristup 15. novembar 2012”. Arhivirano iz originala 21. 07. 2014. g. Pristupljeno 16. 11. 2012. 
  90. ^ „PHP.net: error_log, 20. avgust 2011, pristup 15. novembar 2012”. Arhivirano iz originala 09. 04. 2012. g. Pristupljeno 16. 11. 2012. 
  91. ^ a b „PHP.net: Podešavanja u toku izvršavanja, 20. avgust 2011, pristup 15. novembar 2012”. Arhivirano iz originala 03. 09. 2013. g. Pristupljeno 16. 11. 2012. 
  92. ^ PHP.net List of Keywords, 26. oktobar 2012, pristup 27. oktobar 2012(jezik: engleski)
  93. ^ „PHP.com.net Uvod u forme, pristup 17. novembar 2012”. Arhivirano iz originala 03. 11. 2012. g. Pristupljeno 17. 11. 2012. 
  94. ^ „Matematički fakultet Univerziteta u Beogradu — Predavanja: Struktuiranje teksta, septembar 2000, pristup 18. novembar 2012”. Arhivirano iz originala 19. 06. 2013. g. Pristupljeno 18. 11. 2012. 
  95. ^ PHP.NET, "PHP download for Linux, Unix and Windows"
  96. ^ „www.entropy.ch, "PHP download for Mac OS X". Arhivirano iz originala 5. 09. 2007. g. Pristupljeno 30. 08. 2007. 
  97. ^ PHP.NET, "Downloads"
  98. ^ „The PHP License, version 3.01”. Pristupljeno 20. 5. 2010. 
  99. ^ „GPL-Incompatible, Free Software Licenses”. Various Licenses and Comments about Them. Free Software Foundation. Pristupljeno 3. 1. 2011. 

Literatura uredi

Dodatna literatura uredi

Spoljašnje veze uredi