PHP lekcije - lekcija 7 - PHP funkcije i funkcionalno programiranje
Mislím da smo se već približili trenutku kada je vreme... vreme da zaista počnemo da programiramo. Nakon ove lekcije moći ćete da kažete da ste programirali u PHP-u. Vrlo često treba pisati kod koji se ponavlja na drugim stranicama, u drugim .php fajlovima. Da ne biste duplirali taj kod, u PHP-u postoje funkcije.
Funkcija je nezavisni deo koda koji izvršava određene proračune. Primere takvih funkcija ste već videli u prethodnim lekcijama:
time() - funkcija koja vraća broj sekundi od početka Unix ere.
print(), echo() - funkcije koje omogućavaju prikaz HTML-a.
floor() - funkcija koja izračunava celobrojni deo iz decimalnog broja.
Verovatno ste primetili kako se označavaju funkcije – pomoću dve zagrade (). Opšti zapis funkcije je: ime_funkcije(). Pravila imenovanja funkcija su ista kao i za promenljive, samo što funkcije nemaju znak dolara već imaju zagrade.
Od čega se sastoji funkcija, videćemo na primeru:
<?php function plus_one($x){ // definicija funkcije $x = $x + 1; // telo funkcije return $x; // vraćena vrednost } $y = 1; $y = plus_one($y); // poziv funkcije print $y; ?>
Iz naziva funkcije je jasno da ona uvećava promenljivu za jedan. Hajde sada da razložimo od čega se sastoji funkcija:
Ime funkcije
Ime funkcije se postavlja kao i ime promenljive:
- Ime funkcije mora počinjati slovom ili donjom crtom "_".
- Ime funkcije može sadržati samo slova, brojeve i donju crtu (A-Z, a-z, 0-9, _).
- Ime funkcije ne sme sadržati razmake. Ako je ime funkcije složeno od više reči, one treba da budu odvojene donjom crtom (npr. my_function()) ili velikim slovima (camelCase) npr. myFunction().
Za definisanje funkcije koristimo reč function koja označava da sledi ime funkcije.
Telo funkcije
To je kod koji funkcija izvršava. U našem primeru to je:
function plus_one($x){ $x = $x + 1; // telo funkcije return $x; // telo funkcije }
Telo funkcije je obavijeno vitičastim zagradama {}.
Vraćena vrednost
Već smo pomenuli "vraćanje vrednosti" i sada je vreme da objasnimo šta to znači. Vrednost koja ide posle reči return je vraćena vrednost, odnosno rezultat izvršavanja funkcije. U našem primeru vraćamo vrednost promenljive $x.
Parametri funkcije
Parametri funkcije su promenljive ili vrednosti koje se navode u okruglim zagradama nakon imena funkcije. U našem primeru prosleđujemo jedan parametar $x, ali može ih biti i više, razdvojeni zarezom:
<?php function myFunction($x1, $x2, $x3){ } $y = myFunction($z, 34, 'Zdravo, svete!'); ?>
Ako prilikom definicije funkcije navedemo određeni broj parametara, to pokazuje koliko ih je neophodno proslediti pri pozivu funkcije. Ako broj parametara ne bude odgovarao, dobićete grešku:
<?php function myFunction($x1, $x2, $x3){ } $y = myFunction(34, 'Zdravo, svete!'); // pogrešan poziv funkcije izaziva grešku!!! ?>
Obratite pažnju da u definiciji koristimo lokalna imena promenljivih, dok pri pozivu funkcije možemo proslediti bilo koje vrednosti ili promenljive.
Hajde da vidimo kako funkcije rade na primeru jednostavne matematičke funkcije. Recimo da imamo funkciju y = -2x + 4. Izračunaćemo vrednosti funkcije za različite vrednosti argumenta x.
<?php function myFunction($x){ $y = -2 * $x + 4; return $y; } $z1 = myFunction(1); $z2 = myFunction(2); $z3 = myFunction(3); print $z1 . '<br />' . $z2 . '<br />' . $z3; ?>
Rezultat će biti vrednosti -2, 0, 2. Verujem da vam je sada jasnije kako funkcije rade.
Sada da malo pričamo o funkcionalnom programiranju. Verovatno ste već shvatili zašto se ovaj stil programiranja naziva funkcionalnim – zato što je osnova programiranja mnogo funkcija, desetine u svakom fajlu. A kako se snaći sa tolikim brojem funkcija? Odgovor je jednostavan. Objasniću na primeru.
<?php function incr($x){ $x++; return $x; } function decr($y){ $y--; return $y; } $z = 0; $z = incr($z); $z = incr($z); $z = incr($z); $z = incr($z); $z = decr($z); print $z; ?>
Kao što je prikazano u primeru, povećali smo $z četiri puta za 1 i smanjili jednom za 1, tako da je konačni rezultat 3. Sada ćemo funkcije premestiti ispod primera.
<?php $z = 0; $z = incr($z); $z = incr($z); $z = incr($z); $z = incr($z); $z = decr($z); print $z; function incr($x){ $x++; return $x; } function decr($y){ $y--; return $y; } ?>
Ako izvršite ovaj kod, rezultat neće biti drugačiji, i dalje će biti 3. To je zato što PHP pronalazi funkcije bez obzira na to gde su definisane u odnosu na pozive. Ali šta ako imam 50, 100 ili 1000 funkcija? Odgovor je da ih treba razvrstati prema funkcionalnosti i organizovati u foldere i fajlove. Hajde da napravimo dva fajla:
decr.php:
<?php function decr($y){ $y--; return $y; }?>
incr.php:
<?php function incr($x){ $x++; return $x; }?>
Definicije funkcija treba ukloniti iz index.php, jer ponovna definicija funkcije istog imena izaziva grešku. Takođe, pozivanje funkcije bez definicije izaziva grešku, zato budite pažljivi.
Sada je potrebno da uključimo fajlove sa funkcijama pomoću include u index.php:
<?php include 'incr.php'; include 'decr.php'; $z = 0; $z = incr($z); $z = incr($z); $z = incr($z); $z = incr($z); $z = decr($z); print $z; ?>
Sada možete koristiti kod iz incr.php i decr.php, a da ne zatrpavate index.php. Kao što vidite, rezultat je isti, i dalje 3.
Ovo nije sve od mogućnosti funkcionalnog programiranja u PHP-u, u narednim lekcijama ćemo detaljnije proučiti ovaj stil programiranja.