Kontrolne strukture u PHP-u
Kontrolne strukture su jezički konstrukti koji služe da kontrolišemo izvršavanja programa. To su suštinski naredbe koje služe da u programu realizujemo različite tipove algoritama, tj. da stvorimo razgranate i ciklične strukture.
Grananja
Razgranate strukture služe da na osnovu nekog uslova odredimo koji deo programa će se izvršiti a koji ne. Ove strukture moramo koristiti u programu pošto skoro nikada ne možemo unapred sa sigurnošću znati sa kakvim vrednostima ćemo raditi. Drugim rečima, mora postojati način da u programu kažemo "ako se desi ovo, treba da uradimo ono".
Grananje if-else
Ovo je osnovni tip grananja, koji u nekom obliku postoji u skoro svakom "klasičnom" programskom jeziku. Najprostiji tip je ispitivanje nekog uslova i zadavanje segmenta programa koji će se izvršiti ako je uslov zadovoljen.
Uslov se zadaje obavezno u zagradi, u naredbi if. Posle uslova se zadaje blok naredbi u vitičastim zagradama. Očekuje se da uslov bude logička vrednost, ali može se zadati i string (prazan string je FALSE) i numerik (0 je FALSE).
if (uslov) {
...deo programa koji se izvršava ako je uslov TRUE
}
Proširena verzija if grananja je if-else grananje koje ima i blok za "inače", tj. deo programa koji se izvršava ako uslov nije zadovoljen.
if (uslov) {
...deo programa koji se izvršava ako je uslov TRUE
}
else {
...deo programa koji se izvršava ako je uslov FALSE
}
Višestruko grananje if-elseif-else
PHP poznaje i višestruko grananje koje koristimo ako je situacija takva da nije sve "crno i belo", već treba da definišemo više programskih blokova koji pokrivaju više mogućnosti. Ovo postižemo navodeći elseif (uslov) blokove (koliko god nam puta treba) posle prvog if bloka. Na kraju možemo navesti i običan else blok koji se izvršava u slučaju da ni jedan od zadatih uslova nije bio ispunjen.
if (uslov) {
...deo programa koji se izvršava ako je prvi uslov TRUE
}
elseif (uslov) {
...deo programa koji se izvršava ako je drugi uslov TRUE
}
...
else {
...deo programa koji se izvršava ako ni jedan uslov nije zadovoljen
}
Višestruko grananje switch
Ovaj tip grananja koristimo ako smo u situaciji da je uslov za izvršavanje dela programa takav da upoređujemo izraz sa nekim konkretnim vrednostima. Ako možete, koristite switch umesto if-elseif-else grananja, pošto se brže izvršava.
Različite vrednosti se zadaju pomoću ključne reči case i to sa dvotačkom. Za isti segment naredbi je moguće navesti više case vrednosti.
switch (izraz) {
case vrednost:
...deo programa koji se izvršava ako je izraz == vrednost
break;
case vred1:
case vred2:
...
...deo programa koji se izvršava ako je izraz jednak vred1 ili vred2 ili...
break;
...
default:
...deo programa koji se izvršava ako vrednost izraza nije pronađena
}
Ako vrednost izraza nije pronađena ni u jednom case-u, na kraju možemo koristiti ključnu reč default i postaviti deo programa koji će se izvršiti u takvoj situaciji.
Ciklusi
Rad sa podacimo obično moramo da "serijalizujemo", odnosno da radimo sa celim nizom podataka. U ovom slučaju potrebni su nam ciklične strukture, odnosno način da ponavljamo izvršavanje dela programa sve dok postoji potreba.
Svaki prolazak kroz naredbe ciklusa naziva se iteracija.
Ciklus while
Najosnovniji ciklus je logički ciklus koji se "vrti" sve dok je neki uslov zadovoljen. Posle komande while navodimo uslov (obavezno u zagradi) i zatim blok naredbi koji se ponavlja.
U ovom slučaju uslov se proverava na početku, što znači da ciklus može i da se uopšte ne izvrši.
while (uslov) {
...deo programa koji se ponavlja dok je uslov TRUE
}
Ciklus do-while
Ovo je ista stvar kao malopre, s tim što se uslov proverava na kraju, što znači da će se ciklus izvršiti makar jednom.
do {
...deo programa koji se ponavlja dok je uslov TRUE
} while (uslov);
Ciklus for
Ovo je specifična forma uslovnog while ciklusa, s tim što je zamišljeno da se koristi kao brojački ciklus. Unutar naredbe for zadaju se tri izraza:
- Prvi se izvršava samo jednom, pre početka ciklusa - obično služi za inicijalizaciju (postavljanje početne vrednosti) brojača
- Drugi se izvršava pre početka svake iteracije - tretira se kao logički uslov (obično je to provera brojačke promenljive) i ako mu je vrednost TRUE, iteracija će se izvršiti
- Treći izraz se izvršava po izvršenju svake iteracije i obično služi za promenu brojačke promenljive
for (početni_izraz; uslov; izraz_posle_iteracije) {
...deo programa koji se ponavlja dok je uslov TRUE
}
Ciklus foreach
Ciklus foreach ima specifičnu primenu - za prolazak kroz asocijativne nizove. To je praktično jedini način da "dohvatimo" svaki element asocijativnog niza, pošto oni nisu "nabrojani", kao kod klasičnih numerisanih nizova, već pre predstavljaju strukturu parova ključ-vrednost.
U svakoj iteraciji ciklusa, zadata promenljiva dobija vrednost jednog elementa.
foreach ($niz as $vrednost) {
...deo programa koji radi sa elementom koji ima vrednost $vrednost
}
Ako postoji potreba (a često postoji) da menjamo članove niza ili makar da "znamo" pod kojim ključem se nalazi određena vrednost, koristićemo sledeću formu:
foreach($niz as $indeks => $vrednost) {
...deo programa koji radi sa elementom $vrednost koji je $niz[$indeks]
}
Nasilni prekid ciklusa
Više nego što volimo da priznamo, bićemo u situaciji da želimo da prekinemo izvršavanje ciklusa, pre njegovog "prirodnog" kraja. Nije "lepo" programiranje, ali je korisno.
break
Komanda break služi da se "iskoči" iz kontrolne strukture pre njenog kraja. Naravno, ova komanda se ne odnosi na if grananja - što je i logično jer obično moramo da pitamo da li je zadovoljen neki uslov da bismo iskočili iz ciklusa.
kada se ova komanda izvrši, ciklus se završava.
while (uslov) {
...naredbe
if (uslov) {
break;
}
...naredbe
}
...naredbe posle ciklusa na koje se prelazi ako se izvrši break
continue
Komanda continue je malo "mekša" varijanta iskakanja iz ciklusa. Ona služi samo da se ostatak naredbi unutar ciklusa ignoriše i da se odmah pređe na sledeću iteraciju.
while (uslov) {
...naredbe
if (uslov) {
continue;
}
...naredbe koje se ignorišu u toj iteraciji ako se izvrši continue
}
I break i continue naredbe imaju mogućnost da im se zada celi broj koji označava iz koliko ugnježdenih struktura želimo da "pobegnemo". Default vrednost je, očigledno 1.
Primer
<?php
for ($i=0; $i<$N; $i++) {
$M = $i*2;
for ($j=1; $j<$M; $j+=2) {
echo "Vrednosti su {$i} i {$j}";
if ($i == $j)
break 2;
}
}
$dim["x"] = 140;
$dim["y"] = 260;
$dim["sirina"] = 300;
$dim["visina"] = 400;
foreach($dim as $ind => $vrednost) {
switch ($ind) {
case "x":
case "y":
case "z":
echo "Koordinata {$ind} = {$vrednost}";
break;
case "sirina":
case "visina":
echo "Dimenzija {$ind} = {$vrednost}";
break;
default:
echo "Nepoznata veličina {$ind} = {$vrednost}";
}
}
?>
- PHP.net, Control Structures