|
Structuri de control in PHP
Dupa cum stiti, instructiunile PHP sunt
separate prin caracterul ';'. Deseori, suntem nevoiti sa grupam mai multe
instructiuni pentru a forma un bloc. Astfel, obtinem instructiunile compuse
care sunt formate din mai multe instructiuni simple, separate prin caracterul
';'. In PHP, instructiunile compuse au urmatoarea sintaxa:
Instructiunile care formeaza instructiunea compusa pot fi de orice tip: orice
structura de control, alte instructiuni compuse etc. Asadar un bloc de
instructiuni (o instructiune compusa), in PHP, este delimitat de acolade.
Structura if
Una dintre cele mai importante structuri in orice limbaj este cea alternativa.
In PHP sintaxa acestei structuri este urmatoarea:
if (conditie)
instructiune
Folosirea unei astfel de structuri indica faptul ca instructiunea se va
executa daca si numai daca valoarea expresiei conditie (eventual dupa conversia la tipul boolean) este true.
Constructia if - else
In foarte multe cazuri dorim sa executam o alta instructiune daca valoarea
expresiei conditie este false. In PHP putem utiliza o
constructie de tipul if - else
in acest scop. Sintaxa este:
if (conditie)
instructiune #1
else
instructiune #2
Constructia elseif
Uneori, suntem nevoiti sa folosim structuri alternative imbricate in diferite
scopuri. Folosind constructii de tipul if
- else vom obtine o secventa de tipul:
if (conditie #1)
instructiune #1
else
if (conditie #2)
instructiune #2
else
else
if (conditie #n)
instructiune #n
else
instructiune #n+1
Limbajul PHP permite folosirea unei prescurtari si anume constructia elseif. Practic, aceasta
inlocuieste un else
urmat de un if.
Folosind aceasta structura, codul anterior poate fi scris astfel:
if (conditie #1)
instructiune #1
elseif (conditie #2)
instructiune #2
elseif
elseif (conditie #n)
instruciune #n
else
instructiune #n+1
Sintaxe alternative
Daca dorim sa se execute mai multe instructiuni cand este indeplinita o anumita
conditie, atunci ar trebui sa folosim instructiunile compuse. De exemplu,
pentru o structura if
vom scrie:
if (conditie):
instructiune #1
instructiune #2
instructiune #n
endif
Practic, pentru orice structura de control PHP, putem inlocui acolada deschisa
prin caracterul ' '
si acolada inchisa printr-un cuvant cheie optinut prin adaugarea prefixului end la cuvantul cheie care indica
structura de control. Trebuie observat faptul ca else si elseif nu sunt structuri, ele fiind
simple constructii folosite in cadrul structurii if. Din acest motiv, nu vom avea
niciodata endelse sau
endelseif, ci doar endif-uri. Asadar, sintaxa
alternativa pentru o structura if
in care se folosesc constructii else
si elseif este
urmatoarea:
if (conditie #1)
grup instructiuni #1
elseif (conditie #2)
grup instructiuni #2
elseif
elseif (conditie #n)
grup instructiuni #n
else
grup instructiuni #n+1
endif;
Structura while
Majoritatea script-urilor PHP vor contine cicluri. Pentru a folosi o bucla
anterior conditionata vom utiliza structura while. Sintaxa acestei proceduri este:
while (conditie)
instructiune
Efectul acestei structuri este executarea instructiunii atat timp cat valoarea
expresiei conditie (eventual
dupa conversia la tipul boolean)
este true. Trebuie
observat faptul ca este posibil ca instructiunea sa nu fie executata niciodata.
Si pentru aceasta structura avem la dispozitie o sintaxa alternativa si anume:
while (conditie):
grup instructiuni
endwhile;
Structura do - while
Uneori, dorim sa folosim bucle posterior conditionate. In acest scop, in PHP
avem la dispozitie structura do -
while a carei sintaxa este:
do
instructiune
while (conditie);
Singura diferenta fata de structura while
este faptul ca valoarea conditiei este determinata, de fiecare data, dupa
executarea instructiunii. Ca urmare, instructiunea va fi executata cel putin o
data. Nu exista o sintaxa alternativa pentru aceasta structura.
Structura for
O alternativa cu o functionalitate mai ridicata pentru utilizarea buclelor este
structura repetitiva for.
Sintaxa este foarte asemanatoare cu cea din limbajele C/C++ si Java si anume:
for (expresie #1; expresie #2; expresie
#3)
instructiune
Prima expresie este evaluata o singura data, inainte de inceperea executiei
ciclului. Instructiunea este executata cat timp cea de-a doua expresie are
valoarea true. De
fiecare data, dupa executarea instructiunii este evaluata cea de-a treia
expresie. Oricare dintre cele trei expresii poate lipsi; in cazul in care o
expresie lipseste, se considera ca ea are valoarea true. Pentru structura for poate fi folosita si urmatoarea
sintaxa alternativa:
for (expresie #1; expresie #2; expresie
#3):
instructiune
endfor;
Exemple
In continuare aveti un exmplu care afiseaza numerele cuprinse intre 1 si 15.
Numerele pare vor fi scrise cu rosu, iar cele impare care sunt divizibile cu 3
cu verde, iar celelalte cu albastru. Vom folosi o structura repetitiva pentru a
afisa numerele si o structura alternativa pentru a determina culoarea cu care
vor fi afisate. Putem utiliza oricare dintre cele trei structuri repetitive;
codul PHP pentru cele trei variante sunt prezentate in tabelul de mai jos.
Exemplu
Rezultat
<?php
// Structuri alternative si repetitive
// Bucla for
// Exemplu
for ($i = 1; $i <= 15; $i++):
echo '<b><font size = 3 ';
echo 'color = ';
if ( ! ($i % 2))
echo 'red';
elseif ( ! ($i % 3))
echo 'green';
else
echo 'blue';
echo '> $i </font></b>';
endfor;
?>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
<?php
// Structuri alternative si repetitive
// Bucla while
// Exemplu
$i = 1;
while ($i<=15)
?>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
<?php
// Structuri alternative si repetitive
// Bucla do - while
// Exemplu
$i = 1;
do while ($i <= 15);
?>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Structura foreach
Aceasta structura poate fi folosita pentru a realiza o iteratie printre toate
elementele unui vector. Asadar, ea nu poate fi folosita decat impreuna cu
vectorii; utilizarea sa asupra unei variabile de alt tip duce la aparitia de
erori. Exista doua sintaxe acceptate pentru aceasta structura si anume:
foreach (expresie_vectoriala as $valoare)
instructiune
foreach (expresie_vectoriala as $cheie
=> $valoare)
instructiune
Daca se utilizeaza prima varianta, atunci la fiecare iteratie valoarea
elementului curent este atribuita variabilei $valoare
si apoi se trece la elementul urmator (a carui valoare va fi atribuita
variabilei la urmatoarea iteratie). Executia ciclului se incheie in momentul in
care nu mai exista alte elemente in vector. Singura diferenta care apare in
cazul utilizarii celei de-a doua variante este faptul ca la fiecare iteratie
valoarea cheii elementului curent este atribuita variabilei $cheie. In continuare este un exemplu
de folosire a celor doua sintaxe ale structurii foreach.
Exemplu
Rezultat
<?php
// structura foreach
echo '<TABLE width = 100%><TR><TD with = 50%>';
// un vector obisnuit
$a = array (1, 2, 3, 10);
echo '<b>Parcurgerea unui
vector:</b><br><ol>';
foreach ($a as $v)
echo '<li><i>Valoarea curenta este
</i>:<tt>$v</tt>n<br>';
/* parcurgerea vectorului, contorizarea elementelor si afisarea numarului de
ordine al elementului curent */
$i = 0;
echo '</ol><b>O alta parcurgere: </b><ul>';
foreach ($a as $v)
/* un vector ale carui elemente sunt identificate prin chei */
$a = array (
'unu' => 1,
'doi' => 2,
'trei' => 3,
'zece' => 10
);
echo '</ul><td><width = 50%><b>Parcurgere cu
afisarea cheilor: </b><ul>';
foreach ($a as $k => $v)
// o matrice
$b[0][0] = 'a';
$b[0][1] = 'b';
$b[1][0] = 'c';
$b[1][1] = 'd';
echo '</ul><b>Parcurgerea unei
matrice:</b><br><tt>';
foreach ($b as $v1)
echo '</tt><br><b>Parcurgerea unui vector generat
dinamic: </b><br><tt> ';
// un vector generat dinamic
foreach (array (1, 2, 3, 4, 5) as $v)
echo '$vn';
echo '</tt></td></tr></table>';
?>
Parcurgerea unui vector:
O alta parcurgere:
Parcurgere cu afisarea cheilor:
Parcurgerea unei
matrice:
a b
c d
Parcurgerea unui vector generat dinamic:
1 2 3 4 5
Structura switch
In anumite cazuri trebuie sa efectuam anumite operatii in functie de anumite
valori ale unei expresii. O solutie ar fi folosirea unor structuri if imbricate sau a uneia singure in
care apar mai multe constructii eseif.
Sa presupunem ca o anumita variabila poate avea cinci valori distincte si
pentru fiecare valoare trebuie executata o anumita instructiune. Daca folosim
structura if,
secventa de cod va fi urmatoarea:
if ($variabila == valoare #1)
instructiune #1
elseif ($variabila == valoare #2)
instructiune #2
elseif ($variabila == valoare #3)
instructiune #3
elseif ($variabila == valoare #4)
instructiune #4
else
instructiune #5
Folosind structura switch,
secventa echivalenta este:
swich ($variabila)
Prezentam in continuare sintaxa generala a structurii switch:
switch (expresie)
Pentru inceput se determina valoarea expresiei si apoi se verifica daca aceasta
apare ca valoare pentru una dintre constructiile case. In caz afirmativ, toate
instructiunile incepand cu cea corespunzatoare valorii respective (pana la
sfarsitul blocului swich)
vor fi executate. Executia acestor instructiuni poate fi intrerupta daca este
folosita instructiunea break,
care va fi prezentata mai jos. Daca valoarea expresiei nu corespunde nici uneia
dintre valorile corespunzatoare constructiilor case, se executa instructiunile corespunzatoare
constructiei default.
Daca aceasta lipseste, atunci nu se executa nici o instructiune. Trebuie
precizat faptul ca valorile corespunzatoare constructiilor case pot fi numere intregi, numere
reale sau siruri de caractere; nu pot fi utilizate obiecte sau vectori.
Instructiunea break
Aceasta instructiune poate fi folosita pentru a intrerupe fortat executia unui
ciclu sau a secventei de instructiuni corespunzatoare unei structuri switch. Instructiunea poate fi
urmata de un argument care indica numarul de structuri imbricate a caror
executie se incheie. Valoarea implicita este 1, deci se intrerupe executia unei
singure structuri. Urmatoarea secventa de cod PHP realizeaza parcurgerea
elementelor unui vector de numere intregi pana in momentul in care se
intalneste un numar negativ.
foreach ($a as $v)
if ($v < 0)
break;
Mai departe aveti cazul in care este intrerupta executia mai multor cicluri;
vom considera ca parcurgem elementele unei matrice patratice cu n elemente si n
coloane pana in momentul in care intalnim o valoare nula.
for ($i = 0; $i < $n; $i++)
for ($j = 0; $j < $n; $j++)
if ( ! $a [$i] [$j] )
break 2;
Instructiunea break
poate fi utilizata pentru intreruperea executiei secventelor de instructiuni
corespunzatoare structurilor for,
foreach, while, do - while si switch.
Instructiunea continue
Aceasta instructiune este folosita pentru a intrerupe executia secventei de
instructiuni din interiorul unui ciclu si trecerea la urmatoarea iteratie. In
cazul instructiunii for,
inainte de urmatoarea iteratie se evalueaza (executa) expresia de incrementare
(expresia #3 din sintaxa generala). La fel ca si in cazul instructiunii break, poate aparea un argument
care indica numarul structurilor imbricate asupra carora are efect. Exemplul
urmator realizeaza afisarea elementelor unui sir de numere intregi care sunt
mai mari decat 1000.
foreach ($a as $v)
Urmatorul exemplu ilustreaza efectul folosirii argumentelor pentru
instructiunea continue.
Exemplu
Rezultat
<?php
$i = 0;
while ($i++ <5)
echo 'Acest mesaj nu va fi afisat niciodata.<br>n';
}
echo 'Nici acest mesaj nu va fi afisat niciodata.<br>n';
}
?>
Ciclul #1
Ciclul #2
Ciclul #3
Ciclul #1
Ciclul #2
Ciclul #3
Ciclul #1
Ciclul #2
Ciclul #3
Ciclul #1
Ciclul #2
Ciclul #3
Ciclul #1
Ciclul #2
Ciclul #3
Alte structuri PHP
Exista mai multe alte structuri PHP care pot fi utilizate in anumite scopuri.
Vom aminti acum cateva dintre ele:
Structurile include, require, include_once si require_once pot fi utilizate
pentru a 'insera' anumite instructiuni care sunt pastrate intr-un alt
fisier (document). Interpretorul PHP considera ca secventa din fisierul inserat
se afla in fisierul din care s-a 'comandat' inserarea in pozitia in
care apare structura de inserare.
O alta structura este declare
care permite crearea unor directive in executie.
Functiile PHP trebuie sa utilizeze instructiunea return pentru a furniza un
rezultat.