s8m2mv
Toate scripturile PHP sunt o suita de instructiuni. O instructiune poate fi o
atribuire, un apel de functie, o instructiune conditionala sau chiar o instructiune
vida. O instructiune se termina de obicei prin punct si virgula, ';'. Instructiunile
pot fi grupate in blocuri delimitate de acolade, 'AS'. Un bloc este considerat
ca o instructiune. Diferitele tipuri de instructiuni sunt descrise in capitolul
urmator.
if
Instructiunea if este importanta in toate limbajele, inclusiv in
PHP. Ea permite executia conditionata a unei parti de cod. Sintaxa instructiunii
if este aceeasi ca si in C:
if( expresie)
A lista de instructiuni
SCum am vazut in paragraful care se refera la expresii, expresie este
evaluata la o valoare de adevar. Daca expresia expresie este TRUE, PHP va executa
instructiunile din lista de instructiuni, iar daca ea este FALSE, instructiunile
vor fi ignorate.
Exemplu:
if( $a > $b) echo "$a este mai mare decat $b";Daca dorim ca un grup de instructiuni
sa fie executate conditionat, este suficient sa inchidem aceste instructiuni
intre acolade pentru a forma un bloc.
Exemplu:
if( $a > $b)
A echo "$a este mai mare decat $b";
$b = $a;
SInstructiunile if pot fi imbricate pe oricate niveluri dorim obtinandu-se
o structura conditionala extrem de flexibila.
else
Daca dorim sa executam doua instructiuni diferite in functie de valoarea
de adevar a unei expresii vom folosi o instructiune if-else ca in exemplul
urmator:
if( $a > $b)
A print "$a este mai mare decat $b";
S else
A print "$b este mai mare decat $a";
SInstructiunile de dupa else sunt executate doar daca expresia conditionala
este evaluata la FALSE.
elseif
Asa cum sugereaza numele, este o combinatie a instructiunilor if si else. Ca
si else, instructiunea elseif extinde o instructiune if pentru a executa alte
instructiuni in cazul in care expresia conditionala din if este
FALSE. Spre deosebire de else, instructiunea alternativa va fi executata doar
daca expresia conditionala din elseif este TRUE.
Spre exemplu, fragmentul urmator de cod va afisa care este relatia dintre $a
si $b.
if( $a > $b)
A print "$a este mai mare decat $b";
S elseif( $a == $b)
A print "$a este egal cu $b";
S else
A print "$b este mai mare decat $b";
SInstructiunile elseif se pot imbrica pe mai multe niveluri, dupa un if initial.
Primul elseif care va fi evaluat la TRUE va fi executat. In PHP, instructiunea
poate fi scrisa si in doua cuvinte: else if. Comportamentul sau va fi
acelasi.
Sintaxa alternativa
PHP propune o sintaxa alternativa pentru instructiunile de control if, while,
for si switch. In fiecare caz principiul este de a inlocui acolada
deschisa cu doua puncte (':') si acolada inchisa prin, respectiv endif;,
endwhile;, endfor;, sau endswitch;.
if( $a == 5): echo $a; endif;Aceasta sintaxa functioneaza de asemenea cu else si elseif. Exemplul urmator
prezinta o structura cu un if, un elseif si un else utilizat in aceasta
noua sintaxa.
if( $a == 5): print "$a este egal cu 5"; print "..."; elseif( $a == 6): print "$a este egal cu 6"; print "!!!"; else: print "$a este diferit de 5 si 6"; endif;while
Bucla while este cea mai simpla implementare a unei bucle in PHP. Aceasta
bucla se comporta la fel ca in C. Sintaxa instructiunii while este:
while( expresie)
A lista de instructiuni
SExecutia unei bucle while este foarte simpla. PHP executa instructiunile din
lista de instructiuni atat timp cat expresia buclei while, expresie,
este evaluata la TRUE. Valoarea expresiei este verificata la fiecare inceput
al buclei si, daca valoarea se schimba pe durata executiei instructiunilor,
executia nu se va sfarsi decat la urmatoarea iteratie (de fiecare
data cand PHP executa instructiunile are loc o iteratie). Daca expresia
buclei while este FALSE inaintea primei interatii, instructiunea nu va
fi niciodata executata.
Mai multe instructiuni pot fi executate intr-o bucla while grupandu-le
intre acolade pentru a forma un bloc sau utilizand sintaxa alternativa
dupa modelul de mai jos:
while( expresie): lista de instructiuni endwhile;Urmatoarele exemple sunt identice ca efect si afiseaza toate numerele
de la 1 la 10:
/* Exemplul 1 */
$i = 1;
while( $i <= 10)
A print $i++; /* Afiseaza valoarea lui $i inaintea incrementarii */
S
/* Exemplul 2 */
$i = 1;
while( $i <= 10): print $i;
$i++; endwhile;do..while
Buclele do..while seamana mult cu buclele while, dar expresia conditionala este
testata la sfarsitul fiecarei iteratii si nu la inceput. Principala
diferenta fata de bucla while este ca prima iteratie a buclei do..while este
intotdeauna executata (expresia nu este testata decat la sfarsitul
iteratiei). Nu exista decat o sintaxa posibila pentru buclele do..while:
do
A lista de instructiuni
Swhile( expresie);Exemplu:
$i = 0; do
A print $i;
Swhile( $i > 0);Bucla de mai sus va fi executata doar o singura data, pentru
ca la prima evaluare a expresiei obtinem FALSE (deoarece variabila $i nu este
mai mare decat 0) si executia buclei se opreste.
Utilizatorii familiari cu C sunt obisnuiti sa utilizeze in mod diferit
buclele do..while, care permite oprirea executiei buclei, prin introducerea
instructiunii break intr-o bucla do..while. Codul urmator demonstreaza
acest lucru:
do
A if( $i < 5)
A print "$i nu este suficient de mare"; break;
S
$i *= $factor; if( $i < $minimum_limit)
A break;
S print "$i este bun";
Swhile( 0);for
Buclele for sunt cele mai complexe bucle in PHP. Ele functioneaza la fel
ca buclele for din limbajul C.
Instructiunea are urmatoarea sintaxa:
for( expr1; expr2; expr3)
A lista de instructiuni
SPrima expresie (expr1) este evaluata (executata) o singura data, neconditionat,
la inceputul buclei.
La inceputul fiecarei iteratii, expresia expr2 este evaluata. Daca evaluarea
devine TRUE, bucla continua si instructiunile din lista de intructiuni sunt
executate. Daca evaluarea devine FALSE, executia buclei se opreste.
La sfarsitul fiecarei iteratii, expresia expr3 este evaluata (executata).
Expresiile pot fi eventual vide. Daca expresia expr2 este vida, inseamna
ca bucla este infinita (PHP considera implicit ca expresia expr2 este TRUE,
ca in C). Acest lucru poate fi util, mai ales cand dorim sa terminam
bucla cu instructiunea break.
In exemplele urmatoare vor fi afisate numerele de la 1 la 10:
/* Exemplul 1 */ for( $i = 1; $i <= 10; $i++)
A print $i;
S
/* Exemplul 2 */ for( $i = 1;; $i++)
A if( $i > 10)
A break;
S print $i;
S
/* Exemplul 3 */
$i = 1; for( ;;)
A if( $i > 10)
A break;
S print $i;
$i++;
S
/* Exemplul 3 */ for( $i = 1; $i <= 10; print $i, $i++) ;Evident, primul exemplu (sau al patrulea)
este cel mai simplu dintre toate, dar utilizarea unei expresii vide intr-o
bucla for poate fi utila de multe ori.
De asemeni, PHP foloseste urmatoarea sintaxa alternativa pentru buclele for:
for( expr1; expr2; expr3): lista de instructiuni endfor;foreach
PHP4 (nu si PHP3) dispune de comanda foreach, ca Perl sau alte limbaje. Instructiunea
ofera un mod simplu de a trece in revista un tablou. Exista doua sintaxe
posibile, a doua este o mica, dar utila, extensie a celei dintai :
foreach( array_expresion as $value)
A lista de instructiuni
S foreach( array_expresion as $key => $value)
A lista de instructiuni
SPrima forma trece in revista tabloul array_expression. La fiecare iteratie,
valoarea elementului curent este atribuita lui $value si pointerul intern al
tabloului este avansat cu un element (astfel, la urmatoarea iteratie aveti acces
la urmatorul element).
A doua forma face acelasi lucru, dar cheia (indicele) elementului curent va
fi atribuita variabilei $key la ficare iteratie.
Nota: cand foreach incepe sa fie executat, pointerul intern al
fisierului este automat repozitionat la primul element al tabloului. Acest lucru
inseamna ca nu veti avea nevoie sa faceti apel la reset() inainte
de foreach. De asemeni, foreach lucreaza cu o copie a tabloului astfel incat
pointer-ul intern al tabloului nu este modificat ca in cazul utilizarii
constructorului each.
Urmatoarele doua exemple functioneaza in acelasi mod:
reset( $arr);
while( list( , $value) = each( $arr))
A echo "Valoare: $value<br>\n";
S
foreach( $arr as $value)
A echo "Valoare: $value<br>\n";
SExemplele urmatoare functioneaza, de asemeni, identic:
reset( $arr);
while( list( $key, $value) = each( $arr))
A echo "Cheie: $key; Valoare: $value<br>\n";
S
foreach( $arr as $key => $value)
A echo "Cheie: $key; Valoare: $value<br>\n";
SUrmeaza 3 exemple de utilizare (exemplul 2.7.1):
/* Exemplul 1: o singura valoare */
$a = array( 1, 2 3, 17); foreach( $a as $v)
A print "Valoarea curenta este \$a: $v.\n";
S
/* Exemplul 2: valoare (cu cheie asociata) */
$a = array( 1, 2 3, 17);
$i = 0; /* Numai pentru afisare */ foreach( $a as $v)
A print "\$aa$ii => $k.\n";
S
/* Exemplul 3: valoarea si cheia */
$a = array(
"unu" => 1,
"doi" => 2,
"trei" => 3,
"saptesprezece" => 17
); foreach( $a as $k => $v)
A print "\$aa$ki => $v.\n";
Sbreak
Instructiunea break permite iesirea dintr-o instructiune if, for, while sau
switch. Instructiunea break accepta un argument numeric optional care va indica
numarul de instructiuni imbricate care trebuiesc intrerupte.
Exemplul 2.7.2:
$arr = array( 'unu', 'doi', 'trei', 'patru', 'stop', 'cinci');
while( list( , $val) = each( $arr))
A if( $val == 'stop') break; /* Se poate scrie si "break 1;" */ echo "$val<br>\n";
S
/* Folosind un argument optional */
$i = 0;
while( ++$i)
A switch( $i)
A case 5: echo "La 5<br>\n"; break 1; /* Se incheie doar instructinuea switch */ case 10: echo "La 10 - iesire<br>\n"; break 2; /* Se incheie instructile switch si while */ default: break;
S
Scontinue
Instructiunea continue este utilizata intr-o bucla pentru a sari peste
instructiunile de dupa continue si pana la sfarsitul blocului; executia
iteratiei curente este intrerupa si se trece la executia iteratiei urmatoare.
Instructiunea continue accepta un argument numeric optional care va indica cate
bucle imbricate vor fi ignorate.
Exemplul 2.7.3:
while( list( $key, $val) = each( $arr))
A if( !( $key % 2)) // Evita elementele impare continue; executa_impar( $val);
S
$i = 0;
while( $i++ < 5)
A echo "Exterior<br>\n";
while( 1)
A echo "Mijloc<br>\n";
while( 1)
A echo "Interior<br>\n"; continue 3;
S echo "Aici nu afiseaza niciodata.<br>\n";
S echo "Nu faceti niciodata asta.<br>\n";
Sswitch
Instructiunea switch este echivalenta cu o serie de instructiuni if. Cu numeroase
ocazii, veti avea nevoie sa comparati aceeasi variabila (sau expresie) cu mai
multe valori diferite si sa executati diferite parti din cod in functie
de valoarea obtinuta. Acesta este modul de executie al instructiunii switch.
Urmatorul exemplu ilustreaza doua modalitati diferite de a scrie acelasi lucru,
una utilizeaza o serie de if si alta utilizeaza instructiunea switch (exemplul
2.7.4):
if( $i == 0) print "$i este egal cu 0"; if( $i == 1) print "$i este egal cu 1"; if( $i == 2) print "$i este egal cu 2";
switch( $i)
A case 0: print "$i este egal cu 0"; break; case 1: print "$i este egal cu 1"; break; case 2: print "$i este egal cu 2"; break;
SEste important sa intelegem modul de executie al instructiunii switch
pentru a evita aparitia erorilor. Instructiunea switch se executa secvential,
linie dupa linie. La inceput nu este executat nici un cod. Numai cand
se gaseste o valoare a selectorului identica cu o constanta case, PHP executa
instructiunile corespunzatoare respectivei constante case. PHP continua sa execute
instructiunile pana la sfarsitul blocului de instructiuni switch
sau pana cand intalneste instructiunea break. Daca nu
utilizati instructiunea break la sfarsitul unui bloc case, PHP va continua
sa execute instructiunile din urmatorul bloc case (exemplul 2.7.5):
switch( $i)
A case 0: print "$i este egal cu 0"; case 1: print "$i este egal cu 1"; case 2: print "$i este egal cu 2";
SIn acest exemplu, daca $i este egal cu 0, PHP va executa toate instructiunile
print. Daca $i este egal cu 1, PHP va executa ultimele doua instructiuni print
si numai daca $i este egal cu 2 veti obtine rezultatul scontat, adica se va
afisa $i este egal cu 2. Deci, imporatant este sa folositi corect instructiunea
break.
In comanda switch, conditia este evaluata o singura data si rezultatul
este comparat cu fiecare constanta case. Intr-o instructiune elseif, conditia
este reevaluata. Daca conditia voastra este mai complicata decat o simpla
comparatie sau apare intr-o bucla, instructiunea switch se poate dovedi
mai rapida.
Lista de instructiuni a unei constante case poate fi vida; in acest caz
PHP va utiliza lista de instructiuni din case-ul urmator.
switch( $i)
A case 0: case 1: case 2: print "$i este mai mic decat 3, dar nu este negativ"; break; case 3: print "$i este egal cu 3";
SUn caz special il constituie expresia predefinita default. Aceasta expresie
indica orice expresie diferita de constantele case anterioare (exemplul 2.7.6):
switch( $i)
A case 0: print "$i este egal cu 0"; break; case 1: print "$i este egal cu 1"; break; case 2: print "$i este egal cu 2"; break; default: print "$i nu este egal cu 0, 1 sau 2";
SObservatie: expresia predefinita default poate fi folosita oriunde in
instructiunea switch.
Expresiile case pot fi orice expresie scalara de tip intreg, virgula
mobila sau sir de caractere. Tablourile si obiectele pot fi folosite numai daca
sunt dereferentiate la un tip simplu.
Sintaxa alternativa pentru aceasta structura de control este urmatoarea:
switch( $i): case 0: print "$i este egal cu 0"; break; case 1: print "$i este egal cu 1"; break; case 2: print "$i este egal cu 2"; break; default: print "$i nu este egal cu 0, 1 sau 2"; endswitch;include()
Functia include() introduce si evalueaza fisierul specificat in argument.
Daca URL fopen wrappers nu sunt disponibile in PHP (asa cum sunt in
configuratia implicita), puteti specifica fisierul care trebuie inclus utilizand
un URL in locul unui pathname local. Pentru a evita utilizarea eronata
a fisierului inclus, orice cod din fisierul destinatie care trebuie executat
ca un cod PHP trebuie incadrat de tag-uri de inceput si sfarsit
valide in PHP. De asemeni, se poate folosi o instructiune include() intr-o
bucla pentru a include mai multe fisiere diferite, asa cum reiese din exemplul
urmator:
$files = array( 'unu.inc', 'doi.inc', 'trei.inc'); for( $i = 0; $i < count( $files); $i++)
A include( $filesa $ii);
SInstructiunea include() este reevaluata de fiecare data cand este intalnita
intr-un cod PHP. Deoarece include() este o constructie speciala a limbajului,
trebuie sa o includeti intr-un bloc de instructiuni daca ea apare intr-un
bloc conditional.
Exemplu:
/* Utilizarea este GRESITA si nu va functiona in modul dorit */ if( $condition) include( $file); else include( $other);
/* Aceasta este CORECT */ if( $condition)
A include( $file);
S else
A include( $other);
SIn PHP4, cat si in PHP3, se poate executa o instructiune
return in interiorul unui fisier inclus cu include(), executia determinand
incheierea procesului in respectivul fisier si revenirea in
scriptul care l-a solicitat. De asemeni, PHP4 permite sa returnati valori din
fisierele incluse cu include(). Puteti folosi aceste valori ca si cum ar fi
returnate de o functie normala.
Exemplu:
/* Fisierul test.inc */
/* Se presupune ca fisierul test.inc exista in acelasi director cu fisierul main.html */ echo "Inainte de return<br>\n"; if( 1)
A return 27;
S echo "Dupa return<br>\n";/* ... in fisierul main.html */
/* Presupunem ca fisierul main.html contine aceasta: */
$retval = include( 'test.inc'); echo "Fisierul returneaza: '$retval'<br>\n";Atunci cand
main.html este apelat in PHP3, el va genera o eroare de analiza la linia
3 deoarece in PHP3 nu putem evalua valori returnate de include(). In
PHP4 rezultatul va fi:
Inainte de return
Fisierul returneaza: '27'Sa presupunem acum ca main.html a fost modificat si
contine codul urmator:
include( 'test.inc'); echo "Intoarcere in main.html<br>\n";In PHP4 se va afisa:
Inainte de return
Intoarcere in main.htmlDin contra, PHP3 afiseaza:
Inainte de return
27 Intoarcere in main.html
Parse error: parse error in main.html on line 5Eroarea de analiza de mai sus
este rezultatul faptului ca instructiunea return este inclusa impreuna
cu test.inc in acelasi bloc. Daca instructiunea return este mutata in
afara blocului, se afiseaza:
Inainte de return
27 Intoarcere in main.html"27" arata ca PHP3 nu suporta returnarea
valorilor din fisiere in acest mod.
Este important de notat ca atunci cand un fisier este inclus cu include()
codul pe care il contine mosteneste domeniul variabilelor corespunzator
liniei pe care apare instructiunea include() in cod. Orice variabila disponibila
pe respectiva linie va fi disponibila si in fisierul inclus.
include_once
Instructiunea include_once include si evalueaza fisierul specificat in
timpul executiei scriptului. Comportamentul este similar cu cel al instructiunii
include(), deosebirea majora fiind aceea ca daca codul din fisier a fost deja
inclus in script operatia nu va fi repetata. Vom folosi aceasta instructiune
cand un fisier ar putea fi inclus si evaluat de mai multe ori in
executia unui anumit script si dorim sa ne asiguram ca includerea sa se va efectua
numai odata pentru a evita problemele care pot sa apara la redefinirea functiilor,
reinitializarea variabilelor etc.