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.