z5h20hz
<titlu>
Scrierea unor programe PHP cu un grad avansat de complexitate</titlu>
<titlu>Modulul 6:
Scrierea instructiunilor PHP conditionale</titlu>
<titlu>Scopuri</titlu>
• invatati sa definiti si sa folositi valorile de tip adevarat/fals
• invatati sa intelegeti si sa scrieti instructiunile if si
instructiunile conexe
• invatati sa intelegeti si sa scrieti instructiunile switch
si instruc¬tiunile conexe
• invatati sa intelegeti si sa scrieti instructiuni de ciclare,
inclusiv instructiunile while, do while si for
Majoritatea programelor utile nu se comporta in exact acelasi mod la fiecare
rulare a acestora, in schimb, programele iau decizii, executand
uneori o operatie si alteori alta, in functie de circumstante. De exemplu,
un program util pentru calculul impozitului pe venit nu foloseste aceeasi rata
a impozitului pentru fiecare contribua¬bil. In cadrul acestui modul, veti
invata sa incorporati instructiunile conditionale in programele
dumneavoastra, astfel incat programele sa poala lua decizii.
<titlu>Utilizarea valorilor de tip adevarat/fals</titlu>
Programele PHP iau decizii prin evaluarea unor expresii conditionale si executa
instructiuni bazate pe rezultatele acestor evaluari. Expresiile conditionale
sunt asimilate ca avand una din doua valori: true (adevarat) sau false
(fals). Uneori, expresiile conditionale se mai numesc si expresii booleene,
in onoarea matematicianului care le-a studiat, George Boole. Constanta
true are valoarea l, iar const false are valoarea 0.
Puteti forma o expresie conditionala folosind constanta true sau constanta false.
O modalitate mai utila de a forma o expresie conditionala consta in utilizarea
operator relational pentru compararea a doua valori numerice. Sa luam in
conside urmatorul exemplu:
$a<1
Aceasta expresie conditionala foloseste operatorul <, care are, in
esenta, aceeasi semnificatie ca in algebra. Expresia are valoarea true
daca si numai daca valoarea variabilei $a este mai mica decat unitatea;
in toate celelalte cazuri, are valoarea false. PHP furnizeaza un set de
asemenea operatori relationali, prezentati pe scurt in tabelul 6-1.
PHP nu va obliga sa comparati numai valori numerice. Puteti folosi operatorul
relationali pentru compararea sirurilor; cu toate acestea, un sir care apare
intr-o expresie conditionala este convertit la o valoare numerica inainte
de evaluarea expresiei. Deseori, se ajunge la rezultate neasteptate, in
general, valorile sirurilor trebuie sa fie comparate folosind o functie de comparare
a sirurilor; aceste functii vor fi explicate in Modulul 7.
<tabel 6-1 Operatori relationali ai limbajului PHP>
*Operator
* Descriere
* a<b
*Adevarat daca valoarea lui a este mai mica decat valoarea lui b.
*a>b
*Adevarat daca valoarea lui a este mai mare decat valoarea lui b.
*a<=b
*Adevarat daca valoarea lui a este mai mica sau egala cu valoarea lui b.
*a>=b
*Adevarat daca valoarea lui a este mai mare sau egala cu valoarea lui b.
*a==b
*Adevarat daca valoarea lui a este egala cu valoarea lui b.
*a!=b
*Adevarat daca valoarea lui a este diferita de valoarea lui b.
*a===b
*Adevarat daca a si b sunt identice; cu alte cuvinte, daca a si b au acelasi
tip si daca valoarea lui a este egala cu valoarea lui b.
*a!==b
*Adevarat daca a si b nu sunt identice; cu alte cuvinte, daca a si b nu sunt
de acelasi tip sau daca valoarea lui a este diferita de valoarea lui b.
</tabel 6-1>
Pentru comoditate, puteti forma expresii conditionale fara un operator relational.
De exemplu, daca $a este o variabila numerica, puteti folosi expresia $a ca
expresie conditionala. Expresia este considerata ca avand valoarea false
daca valoarea variabilei $a este zero, respectiv valoarea true daca valoarea
variabilei respective este
diferita de zero. Daca folositi un sir ca expresie conditionala, expresia are
valoarea false daca sirul este vid sau daca are valoarea speciala "\0",
care simbolizeaza un octet cu valoarea zero. Similar, utilizarea unei valori
nedefinite ca expresie conditio¬nala determina obtinerea valorii false.
Daca folositi un tablou sau un obiect ca expresie conditionala, aceasta are
valoarea false daca tabloul sau obiectul sunt vide; in caz contrar, expresia
are valoarea true.
Pentru a sintetiza, iata regulile care definesc rezultatul unei expresii conditionale:
• Constantele true si false isi iau respectiv valorile lor booleene
corespunzatoare.
• O expresie conditionala care consta dintr-o valoare nedefinita are valoarea
false; in caz contrar, rezultatul depinde de tipul valorii, in speta
numeric, sir, tablou sau obiect.
• O expresie conditionala care consta dintr-o valoare numerica are valoarea
false daca valoarea este zero; in caz contrar, are valoarea true.
• O expresie conditionala care consta dintr-o valoare de tip sir are valoarea
false daca sirul este vid; in caz contrar, are valoarea true.
• O expresie conditionala care consta dintr-o valoare de tip tablou sau
obiect are valoarea false daca tabloul sau obiectul sunt vide; in caz
contrar, are valoarea true.
• O expresie conditionala alcatuita dintr-un operator relational si din
operanzii sai ia valori in conformitate cu rezultatul comparatiei (numerice
sau nu).
Puteti forma expresii conditionale complexe prin unirea a doua expresii conditionale
cu ajutorul unui operator logic. De exemplu, expresia urmatoare este adevarata
daca ambele expresii conditionale care o compun sunt adevarate:
$a < 1 AND $b < 1
Cu alte cuvinte, expresia este adevarata daca atat variabila $a, cat
si variabila $b au valori mai mici decat unitatea. Tabelul 6-2 prezinta
pe scurt operatorii logici ai limbajului PHP. Retineti ca puteti prefixa o expresie
conditionala cu operatorul !, care inverseaza valoarea „adevarat"
sau „fals" a operandului sau.
In general, expresiile sunt evaluate de la stanga la dreapta. Totusi,
operatorii care apar in partea superioara a tabelului dispun de o precedenta
mai ridicata si sunt efectuati anterior operatorilor cu o precedenta mai redusa,
daca nu sunt folosite paranteze pentru a specifica o alta ordine a operatiilor.
<tabel 6-2 Operatori logici ai limbajului PHP>
*Operator
* Descriere
*x AND y
*Adevarat daca atat x, cat si y sunt adevarate.
*x && y
*Adevarat daca atat x, cat si y sunt adevarate.
*x OR y
*Adevarat daca minimum una din expresiile x si y este adevarata.
*x || y
*Adevarat daca minimum una din expresiile x si y este adevarata.
*x XOR y
*Adevarat daca numai una din expresiile x si y este adevarata.
*!x
*Adevarat daca x este falsa.
</tabel 6 -; 2>
<Sfatul specialistului>
Intrebare: De ce foloseste PHP doi operatori logici reprezentand
conjunctii (AND si &&) si doi operatori logici reprezentand, disjunctii
(OR si ||)? Care sunt diferentele intre cele doua tipuri de operatori?
Raspuns: Ambii operatori de conjunctie executa aceeasi operatie, ca de altfel
si ambii operatori de disjunctie. Cu toate acestea, operatorii difera din punctul
de vedere al precedentei - caracteristica determinanta a ordinii in care
sunt executate operatiile in timpul evaluarii expresiilor. Operatorii
&& si || au o prece¬denta relativ ridicata, in timp ce operatorii
AND si OR au o precedenta relativ redusa. Tabelul 6-3 indica precedenta operatorilor
PHP, continand numerosi operatori care nu au fost inca prezentati.
<tabel 6-3 Precedenta operatorilor PHP>
*Operator
*! I ++ — (int) (double) (string) (array) (object)
** / %
*+ - .
*< <= > >=
*= = != = = = ! = =
*&
*?
*?
*&&
*??
*?:
*= += -= *= /= .= %= &= ?= ?= I= <<= >>=
*And
*Xor
*Or
*,
</tabel 6-3>
De exemplu, sa consideram urmatoarea expresie:
$a + $b * $c
Precedenta operatorului de multiplicare * este mai ridicata decat aceea
a operatorului de adunare +, deci inmultirea este efectuata prima, chiar
daca adunarea apare la stanga inmultirii. Cu alte cuvinte, expresia
este evaluata ca si cum ar fi fost scrisa astfel:
$a + ( $b * $c )
Daca doriti ca adunarea sa fie efectuata prima, puteti folosi paranteze in
cadrul expresiei, astfel:
( $a + $b ) * $c
<Test „la minut">
Sa presupunem ca variabila $a are valoarea 10, variabila $b are valoarea l,
iar variabila $c are valoarea 1:
• Care este valoarea expresiei $a < $b?
• Care este valoarea expresiei $a <= $b?
• Care este valoarea expresiei $a > $b?
• Care este valoarea expresiei $b >= $c?
• Care este valoarea expresiei $a > $b AND $b >= $c?
</Test „la minut">
<titlu>Scrierea instructiunilor if simple</titlu>
Expresiile conditionale nu sunt deosebit de interesante sau utile ca atare.
Aceste expresii sunt insa esentiale pentru scrierea instructiunilor conditionale,
prin care se iau decizii. Cea mai simpla instructiune conditionala este instructiunea
if, care executa doua operatii. Mai intai, evalueaza o expresie
conditionala. Apoi, daca si numai daca valoarea expresiei conditionale este
true, instructiunea if executa o instructiune specificata.
Iata o instructiune if simpla:
If ($numar > 10)
Echo „ Acesta este un numar mare „;
Sa ne reamintim ca, in general, limbajul PHP ignora spatiile albe. In
mod conventional, o instructiune asociata unei instructiuni if este scrisa decalat
in raport cu aceasta. Acest procedeu este recomandat deoarece prin utilizarea
sa este facilitata citirea programului. Atunci cand este executata, instructiunea
if evalueaza expresia conditionala $numar > 10, care este adevarata numai
daca valoarea variabilei $numa este mai mare decat 10. Instructiunea echo
este executata numai daca valoarea variabilei $numar este mai mare decat
10.
Pentru a acumula experienta in utilizarea instructiunii if, nu uitati
sa parcurgeti Proiectul 6-1.
<titlu>Proiect 6-1: Testarea valorilor numerice</titlu>
In cadrul acestui proiect, veti scrie si veti executa un mic program PHP,
care include o instructiune if. Programul indica daca un numar pe care il
introduceti este sau nu mai mare decat 10.
<nota>Raspunsuri la test:
• false
• false
• true
• true
• true
</nota>
<titlu>Scopul proiectului</titlu>
• Prezentarea modului de functionare a instructiunii if
<titlu>Pas cu pas</titlu>
1. Plasati urmatorul script PHP intr-un fisier denumit p-6-1. php si incarcati
acest fisier in serverul dumneavoastra PHP:
<HTML>
<HEAD>
<TITLE>Proiect 6-1</TITLE>
</HEAD>
<BODY>
<!--Fisier p-6-1.php -->
<?php echo „ Numarul introdus a fost : $numar.”; if ($numar > 10) echo „ <BR> Acesta este numar mare.”;
?>
</BODY>
</HTML>
2. Plasati urmatoarea pagina HTML intr-un fisier denumit p-6-1 .html
si incarcati acest fisier in serverul dumneavoastra, plasandu-l
in acelasi catalog ca si fisierul p-6-1 .php:
<HTML>
<HEAD>
<TITLE>Proiect 6-1</TITLE>
</HEAD>
<BODY>
<!--Fisier p-6-1.html-->
<FORM METHOD=”POST” ACTION=”p-6-1.php”>
Introduceti o valoare numerica:
<BR><INPUT TYPE=”TEXT” NAME=”numar”>
</FORM>
</BODY>
</HTML>
3. Orientati un browser Web spre adresa URL a fisierului incarcat in
etapa precedenta. Ecranul browserului trebuie sa fie asemanator celui prezentat
in ilustratia urmatoare. Introduceti un numar si apasati pe tasta ENTER.*
4. In momentul executiei scriptului de prelucrare, acesta compara valoarea
pe care ati introdus-o cu valoarea 10. Daca ati introdus o valoare mai mare
decat 10, scriptul afiseaza un mesaj. Un rezultat caracteristic este prezentat
in ilustratia urmatoare.
<imagine>
Enter a numeric value:
11
The nxnnber entertd was: 11.
That's a big number.
</imagine>
<nota>
*In original este mentionata tasta RETURN, nume care nu se mai utilizeaza
de mult in tastaturile calculatoarelor. - N.T.
</nota>
<Test „la minut">
• Scrieti o instructiune care afiseaza mesajul „aoleu!" daca
valoarea varia¬bilei $erori este mai mare decat zero.
• Scrieti o instructiune if care afiseaza mesajul „nu trece"
daca valoarea variabilei $culoare este egala cu valoarea variabilei $rosu sau
cu valoarea variabilei $galben. </Test „la minut">
<titlu>Scrierea unor instructiuni if mai complexe</titlu>
Sa presupunem ca doriti sa executati nu una, ci doua instructiuni in cazul
in care o anumita expresie conditionala este adevarata. Puteti scrie doua
instructiuni if, cate una pentru fiecare dintre instructiunile pe care
doriti sa le executati. Alternativ, puteti crea un grup de instructiuni, prin
includerea unei serii de instructiuni intre paranteze acolade. Un grup
de instructiuni se comporta ca o singura instructiune si se poate asocia cu
o instructiune if. Sa consideram urmatorul exemplu:
if ($numar > 10 )
? echo „<BR>Numarul este mai mare decat 10.”; echo „<BR>Deci, trebuie sa fie mai mare.”;
?
In cazul in care expresia conditionala are valoarea true, sunt
executate ambele instructiuni din cadrul grupului de instructiuni. Unii programatori
prefera sa formateze programe ca acesta in alt mod. De exemplu, ei pot
scrie ceva de genul urmator:
if ($numar > 10 )? echo „<BR>Numarul este mai mare decat 10.”; echo „<BR>Deci, trebuie sa fie mai mare.”;
?
Acest stil este mai compact, dar face dificila identificarea parantezei acolade
de deschidere corespunzatoare parantezei de inchidere. Probleme de lizibilitate
de acest gen devin importante la scrierea unor instructiuni if mai complicate.
Sa presupunem ca doriti sa executati o instructiune atunci cand o conditie
este adevarata si o alta instructiune cand conditia este falsa. Instructiunea
else va permite sa procedati astfel. Sa luam in considerare urmatorul
exemplu:
if ($numar > 10 ) echo „<BR>Acesta este un numa mare .”; else echo „<BR>Acesta este un numa mic.”;
<nota>
Raspunsuri la test:
• if ($erori > 0) echo "aoleul";
• if ($culoare == $rosu OR $culoare == Sgalben) echo "nu trece';
</nota>
In acest exemplu, mesajul „Acesta este un numar mare" este
afisat atunci cand valoarea variabilei $numar este mai mare decat
10; mesajul „Acesta este un numarul mic" este afisat in caz
contrar. Daca doriti, puteti folosi o instructiune else cu un grup de instructiuni.
De exemplu:
if ($numar > 10 ) echo „<BR>Acesta este un numar mare.”; else
? echo „<BR>Numarul este mai mic decat 10.”; echo „<BR>Este un numar mic.”;
?
Instructiunea asociata unei instructiuni if sau else poate fi ea insasi
o instruc¬tiune if. O asemenea instructiune if se numeste instructiune if
imbricata. Iata un exemplu de instructiune if imbricata:
if ($numar > 10 ) if ($numa > 100) echo „<BR>Acesta este un numar foarte mare.”; else echo „<BR>Acesta este un numar mare.”; else echo „<BR>Acesta este un numar mic.”;
Exemplul afiseaza mesajul „Acesta este un numar foarte mare." daca
valoarea variabilei $numar depaseste 100; in caz contrar, daca valoarea
variabilei $numar este mai mare decat 10, se afiseaza mesajul „Acesta
este un numar mare.". Daca valoarea variabilei $numar este mai mica sau
egala cu 10, exemplul afiseaza mesajul „Acesta este un numar mic.".
Instructiunile if imbricate pot deveni extrem de dificil de inteles daca
numarul de instructiuni si nivelul de imbricare nu sunt relativ reduse. Deci
trebuie sa le folositi cu economie.
O instructiune corelata atat cu instructiunea if, cat si cu instructiunea
else, este instructiunea elseif. Cand este folosita corect, poate fi mai
simplu de inteles decat o instructiune if imbricata, logic echivalenta
cu aceasta. Iata un exemplu de instrutiune elseif:
if ($numar > 100 ) echo „<BR>Acesta este un numar foarte mare.”; elseif ($numa > 10) echo „<BR>Acesta este un numar mare.”; elseif ($numa > 1) echo „<BR>Acesta este un numar mic.”; else echo „<BR>Acesta este un numar foarte mic.”;
Exemplul extinde functionalitatea exemplului anterior, afisand mesajul
„Acesta este un numar foarte mic." pentru valori ale variabilei $numar
mai mici sau egale cu 1. Intr-un caz general, cu o instructiune if si
cu o instructiune else poate fi asociat
un numar mult mai mare de instructiuni elseif. PHP evalueaza expresiile conditio¬nale
in mod succesiv, pornind de la expresia conditionala asociata instructiunii
if . PHP executa instructiunea asociata primei expresii conditionale care are
valoarea true; daca nici o expresie conditionala nu are valoarea true, PHP executa
instruc¬tiunea asociata cu instructiunea else. Este permisa omiterea instructiunii
else, caz in care nu este executata nici o instructiune daca nici una
din expresiile conditionale nu are valoarea true.
<Test „la minut">
• Scrieti o instructiune if si o instructiune else pentru a afisa mesajul
„stai" daca valoarea variabilei $culoare este egala cu valoarea variabilei
$rosu sau cu valoarea variabilei $galben, respectiv pentru a afisa mesajul „liber"
in caz contrar.
• Scrieti o instructiune if si o instructiune else pentru a inmulti
valoarea variabilei $numar cu 10 daca valoarea variabilei $factor este l, respectiv
pentru a inmulti valoarea variabilei $numar cu 100 in caz contrar.
</Test „la minut">
<titlu>Scrierea instructiunilor switch, break si default</titlu>
Instructiunea if va permite sa luati o decizie in doua sensuri. Pentru
a putea lua o decizie in mai multe sensuri, puteti folosi mai multe instructiuni
if , else sau elseif. Cu toate acestea, cand doriti ca programul dumneavoastra
sa aleaga dintr-un set de alternative care pot fi reprezentate prin valori intregi,
instructiunea switch este o optiune mai convenabila.
De exemplu, sa presupunem ca valoarea variabilei $numar este l, 2 sau 3, reprezentand
respectiv dimensiunile mica, medie si mare. Iata un mic program care afiseaza
dimensiunile asociate valorilor variabilei $numar:
Switch($numar)
? case(1): echo „ mic”; break;
<nota>
Raspunsuri la test:
• if ($culoare == $rosu OR $culoare == $galben) echo "stai"; else echo "liber";
• if ($factor ==1)
$numar = 10 * $numar; else
$numar = 100 * $numar;
</nota>
94 case(2): echo „mediu”; break; case(3): echo „mare”; break; default: echo „Acesta nu este un cod valabil”;
?
Actiunea unei instructiuni switch este determinata de valoarea unei expresii
intregi, nu de valoarea unei expresii conditionale. Numele variabilei
este dat intre parantezele care urmeaza dupa cuvantul cheie switch.
Parantezele acolade sdelimi¬teaza o serie de instructiuni case si o instructiune
default optionala, fiecare dintre instructiunile cuprinse intre paranteze
putand avea instructiuni asociate. Cand este executata, instructiunea
switch incearca sa stabileasca o identitate intre valoarea variabilei
sale asociate si valoarea asociata unei instructiuni case. Se vor executa instructiunile
asociate primei instructiuni case pentru care identitatea respectiva est valabila.
Daca valoarea variabilei din instructiunea switch nu corespunde nici uneia din
valorile asociate instructiunilor case, se vor executa instructiunile asociate
instructiunii default, daca exista o asemenea instructiune.
Un procedeu de programare indicat consta in aceea ca fiecare instructiune
case din cadrul unei instructiuni switch sa se incheie cu o instructiune
break. Instructiunea break determina incheierea executiei instructiunii
switch, transferand controlul urmatoarei instructiuni secventiale care
succede instructiunii switch. In absenta instructiunii break, executia
trece la urmatoarea instructiune case sau default, fapt nedorit in majoritatea
cazurilor.
<Sugestie>
Nu este necesar sa folositi numere intregi consecutive in instructiunile
case ale unei instructiuni switch. Daca preferati, puteti folosi numere intregi
non-consecutive, numere cu virgula mobila sau siruri.</Sugestie>
<Sfatul specialistului>
Intrebare: PHP include numeroase instructiuni conditionale, incluzand
instructiunile if, else, elseif si switch. Exista si alte mecanisme de luare
a deciziilor?
Raspuns: Da. Operatorul conditional ?:, denumit uneori operator ternar sau operator
intrebare-doua puncte, constituie o alta modalitate de a scrie decizii
in PHP. Operatorul conditional formeaza o expresie care se poate folosi
in multe contexte PHP. Iata sintaxa de utilizare a acestuia: expresie-conditionala ? valoare-adevarat : valoare-fals
Observati cum semnul intrebarii este separat de caracterul doua puncte
prin valoarea valoare-adevarat. Operatorul conditional isi evalueaza expresia
conditio¬nala. Daca expresia este evaluata la valoarea true (adevarat),
operatorul conditio¬nal returneaza valoarea valoare-adevarat; in caz
contrar, returneaza valoarea valoare-fals. Operatorul conditional va permite
sa specificati deciziile intr-o maniera foarte concisa.
De exemplu, sa luam in considerare urmatoarea instructiune de atribuire,
care foloseste un operator conditional: $a = ($b > $c) ? 1 : 2
Aceasta instructiune de atribuire compara valorile variabilelor $b si $c. Daca
valoarea variabilei $b este mai mare decat aceea a variabilei $c, atunci
variabilei $a ii este atribuita valoarea 1; in caz contrar, variabilei
respective ii este atribuita valoarea 2. </Sfatul specialistului>
<Test „la minut">
• Scrieti o instructiune switch care testeaza valoarea variabilei $exponent.
Instructiunea trebuie sa atribuie variabilei $factor o valoare dupa cum urmeaza:
daca $exponent este l, $factor primeste valoarea 10; daca $exponent este 2,
$factor primeste valoarea 100; altfel, $factor primeste valoarea 0.
• in programare, se recomanda ca fiecare instructiune case sa fie
asociata cu o instructiune ________.</Test „la minut">
<titlu>Scrierea instructiunilor for</titlu>
Instructiunea for este o instructiune bucla sau o instructiune iterativa; cu
alte cuvinte, o instructiune care executa in mod repetat instructiunile
asociate. Iata un exemplu de utilizare a unei instructiuni for:
<nota>
Raspunsuri la test:
• switch($exponent)
A case 1:
$factor = 10; break; case 2:
$factor =100; break; default:
$factor = 0;
S
• break</nota>
$suma = 0 for ($n =1; $n<=3; $n++)
$suma += $n; echo !<BR>Suma intregilor de la 1 la $numa este $suma.”;
96
In exemplu se calculeaza suma intregilor cuprinsi intre l
si 3. Pentru aceasta, mai intai se initializeaza variabila $suma
la valoarea 0. Apoi, se executa o instructiune for care incrementeaza in
mod repetat valoarea variabilei $suma.
Pentru a vedea cum functioneaza mecanismul acestei instructiuni, sa examinam
componentele instructiunilor for. Instructiunea for include trei expresii, care
apar intre paranteze; fiecare expresie este separata de vecina sa printr-un
caracter punct si virgula. De asemenea, instructiunea for include o instructiune
sau un grup de instructiuni, cunoscute sub numele de corpul instructiunii for.
in exemplul de mai sus, instructiunea $suma += $n este corpul instructiunii
for.
Sa examinam mai amanuntit cele trei expresii:
• Prima expresie este expresia de initializare. Aceasta se executa atunci
cand PHP ajunge la instructiunea for. In exemplu, expresia de initializare
atribuie valoarea variabilei $n, variabila denumita variabila de ciclare sau
index.
• A doua expresie este expresia de test. Aceasta este o expresie conditionala
care indica daca se executa sau nu corpul instructiunii, in general, face
referire la variabila de ciclare. In cadrul exemplului, expresia de test compara
valoarea variabilei $n cu valoarea 3. Expresia de test este evaluata pentru
prima data imediat dupa evaluarea expresiei de initializare.
• Cea de-a treia expresie este expresia pas. in general, aceasta
modifica una sau mai multe variabile la care se face referire in expresia
test. in cadrul exemplului, expresia pas incrementeaza valoarea variabilei
$n.
Secventa de executie a unei instructiuni for este urmatoarea:
1. Se evalueaza expresia de initializare.
2. Se evalueaza expresia test.
3. Daca rezultatul evaluarii expresiei test este false, se executa etapa 7.
4. Se executa corpul buclei.
5. Se evalueaza expresia pas.
6. Se trece la etapa 2.
7. Se incheie executia instructiunii for, prin executarea urmatoarei instructiuni
secventiale.
Instructiunea for este utila pentru numarare si executarea in mod repetat
a unor actiuni. Ca alt exemplu, iata o instructiune for care creeaza numeroase
controale de tip buton. Numarul controalelor create este determinat de valoarea
variabilei $numar:
for($n=0;$n<=$numar; $n++) echo „<BR><INPUT TYPE =\”BUTTON\” VALUE=\”$n\”>\n”;
Asa cum veti vedea in Modulul 8, instructiunea for este utila mai ales
in lucrul cu tablouri.
<Test „la minut">
• Scrieti o instructiune for care calculeaza suma intregilor cuprinsi
intre l si 100.
• Scrieti o instructiune for care afiseaza la iesire etichete HTML <BR>.
Numarul etichetelor afisate trebuie sa fie egal cu valoarea variabilei $n. </Test
„la minut">
<titlu>Scrierea instructiunilor while si do while</titlu>
Practic, instructiunile while si do while reprezinta versiuni „manuale"
ale instructiunii for. Daca o instructiune for are trei expresii, o instructiune
while sau do while una singura, si anume expresia de test. Asa cum se intampla
de obicei, expresiile iei instructiuni for sunt optionale; fara o expresie de
initializare sau o expresie pas, ' instructiune for opereaza in acelasi
mod ca o instructiune while. in consecinta, urmatoarele doua instructiuni
sunt echivalente:
for ( ; $i<= 3; ) $suma += $i;
while ($i <= 3) $suma ++ $i;
Cand folositi o instructiune while, trebuie sa furnizati un mecanism
oarecare, analog expresiei de incrementare a instructiunii for, care actualizeaza
variabilele la care se face referire in expresia de test. De asemenea,
sunteti responsabil cu initializarea tuturor valorilor folosite in expresia
de test.
Secventa de executie a unei instructiuni while este urmatoarea:
1.Se evalueaza expresia test.
2.Daca rezultatul este false, se trece la etapa 5.
3.Se executa corpul buclei.
4.Se trece la-etapa 1.
5. Se paraseste bucla, prin executarea urmatoarei instructiuni secventiale.
Iata un exemplu care utilizeaza instructiunea while:
$n = 0;
$suma = 0;
while ($n <= 3)
?
<nota>
Raspunsuri la test:
• $suma = 0; for ($i = 1; $i <= 100; $i++)
$suma = $suma + $i;
• for ($i = 1; $i <= $n; $i++) echo " <BR>;
</nota>
$suma = $suma +$n;
$n++;
? echo „Suma este $suma.”
Remarcati ca instructiunea $n = 0; initializeaza bucla si ca instructiunea
n++; incrementeaza valoarea variabilei bucla $n. Instructiunea while este cel
mai utila atunci cand un alt program necesar executa deja aceste functii;
in asemenea situatii, instructiunea while este mai clara decat o
instructiune for degenerata, careia ii lipsesc una sau mai multe dintre
expresiile sale obisnuite.
Instructiunea do while este oarecum asemanatoare instructiunii while. Diferenta
este aceea ca instructiunea do while isi executa corpul inainte
de a-si evalua expresia de test. Astfel, corpul buclei unei instructiuni do
while este intotdeauna executat cel putin o data; corpul unei instructiuni
while este omis daca expresia de test are initial valoarea false.
Secventa de executie a unei instructiuni do while este urmatoarea:
1. Se executa corpul buclei.
2. Se evalueaza expresia de test
3. Daca rezultatul este adevarat, se trece la etapa 1.
4. Se incheie executia buclei, prin executarea urmatoarei instructiuni
secventiale.
Iata un exemplu care foloseste o instructiune do while. Observati ca amplasarea
expresiei de test imediat dupa corpul buclei va reaminteste faptul ca executarea
corpului are loc inainte de evaluarea expresiei de test
$suma = 0;
$n = 1; do
?
$suma += $n;
$n++;
?
while ($n <= $numar); echo „<BR>Suma intregilor cuprinsi intre 1 si $numar
este $suma.”;
<Sfatul specialistului>
Intrebare: Instructiunea while si instructiunea do while par foarte asemanatoare.
Cand trebuie sa folosesc o instructiune do while in locul unei instructiuni
while?
Raspuns: Expertii in programare au demonstrat ca este posibila scrierea
oricarui program fara a folosi nici o instructiune do while. Deci, utilizarea
instructiunii do while este o chestiune de comoditate, nu de necesitate. Va
puteti des¬curca folosind numai instructiuni while.
In general, este bine sa fiti prudent si sa folositi instructiunea while,
care evalueaza o expresie de test inainte, de executarea corpului acesteia.
Astfel, se evita executarea eronata a corpului buclei. Totusi, cand vedeti
un model ca acesta:
<o actiune oarecare>;
while(expresie - test)
A
<aceeasi actiune>
?
atunci puteti inlocui linistit programul respectiv cu un program care
foloseste o instructiune do while: do
A
<o actiune oarecare>;
?while (expresie-test);
</sfatul specialistului>
<Test „la minut">
• Scrieti o instructiune while si instructiunile asociate care afiseaza
suma intregilor cuprinsi intre l si 100.
• Scrieti o instructiune do while si instructiunile asociate care afiseaza
suma intregilor cuprinsi intre l si 100. </Test „la minut">
<titlu>Proiect 6-2: Validarea datelor de intrare introduse de utilizator</titlu>
In cadrul acestui proiect, veti crea un formular HTML si un script PHP
care permit unui utilizator sa introduca date personale de categoria celor folosite
intr-o agenda de adrese e-mail. Scriptul PHP valideaza datele introduse
de utilizator, garantand existenta datelor in campurile obligatorii.
<titlu>Scopurile proiectului</titlu>
• Prezentarea modului de utilizare a instructiunilor conditionale
• Prezentarea unui mod de validare a datelor dintr-un formular
<nota>
Raspunsuri la test:
• $suma = 0;
$n = 1 ;
while ($n <= 100)
$suma += $n; echo "suim este $suma.";
• $suma = 0;
$n = 1; do
A
$suma += $n;
Swhile ($n <= 100) echo „suma este $suma.";
</nota>
<titlu>Pas cu pas</titlu>
1. Plasati urmatorul script PHP intr-un fisier denumit p-6-2. php si incarcati
acest fisier in serverul dumneavoastra PHP:
<HTML>
<HEAD>
<TITLE>Proiect 6-2</TITLE>
</HEAD>
<BODY>
<! -- Fisierul p-6-2.php -- >
<?php
$erori=0; if (!trim($porecla))
? echo „<BR><B>Porecla</B> este obligatorie.”;
$erori++;
?
if (!trim($prenume))
? echo „<BR><B>Prenume</B> este obligatoriu.”;
$erori++;
?
if (!trim($nume))
? echo „<BR><B>Numele</B> este obligatoriu.”;
$erori++;
?
if (!trim($email))
? echo „<BR><B>Adresa primara de e-mail</B>”.
„ este obligatorie.”;
$erori++;
?
if ($erori>0) echo „<BR><BR><BR>Va rugam folositi butonul Back ”.
„ al browserului dumneavoastra pentru a reveni la „.
„formular, corectati ”; if ($erori == 1) echo „eroarea, ”; if ($erori > 1) echo „erorile, ”; if ($erori > 0) echo „si reexpediati formularul.”;
?>
</BODY>
</HTML>
2. Plasati urmatoarea pagina HTML intr-un fisier denumit p-6-2.html si
incarcati acest fisier in serverul dumneavoastra, plasand
fisierul in acelasi catalog cu fisierul p-6-2.php:
<HTML>
<HEAD>
<TITLE>Proiect 6-2</TITLE>
</HEAD>
<BODY>
<! -- Fisierul p-6-2.html -- >
<FORM METHOD=”POST” ACTION=” p-6-2.php”>
<H1>Informatii privind persoana de contact</H1>
<TABLE>
<TR>
<TD><B>Porecla:</B></TD>
<TD><INPUT TYPE=”TEXT” NAME=”porecla”></TD>
</TR>
<TR>
<TD>Titlu:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”titlu”></TD>
</TR>
<TR>
<TD><B>Prenume:</B></TD>
<TD><INPUT TYPE=”TEXT” NAME=”prenume”></TD>
</TR>
<TR>
<TD>Prenumele tatalui:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”prenume_tata”></TD>
</TR>
<TR>
<TD><B>Nume:</B></TD>
<TD><INPUT TYPE=”TEXT” NAME=”Nume”></TD>
</TR>
<TR>
<TD><B>Adresa de e-mail principala:</B><TD>
<TD><INPUT TYPE=”TEXT” NAME”email”></TD>
<TD WIDTH=”20”> </TD>
<TD>Adresa de e-mail secundara:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”emailsecundar”></TD>
</TR>
<TR>
<TD>Numele companiei:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”nume_companie”></TD>
</TR>
<TR>
<TD>Adresa firmei:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”adresa_firmei1”></TD>
<TD WIDTH=”20”> </TD>
<TD>Adresa la domiciliu:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”adresa_acasa”></TD>
</TR>
<TR>
<TD></TD>
<TD><INPUT TYPE=”TEXT” NAME”adresa_firmei2”></TD>
</TR>
<TR>
<TD>Oras:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”oras_birou”></TD>
<TD WIDTH=”20”> </TD>
<TD> </TD>
<TD><INPUT TYPE=”TEXT” NAME=”oras_acasa”></TD>
</TR>
<TR>
<TD>Stat:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”stat_birou”></TD>
<TD WIDTH=”20”> </TD>
<TD> </TD>
<TD><INPUT TYPE=”TEXT” NAME=”stat_acasa”></TD>
</TR>
<TR>
<TD>Cod postal:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”cod_birou”></TD>
<TD WIDTH=”20”> </TD>
<TD> </TD>
<TD><INPUT TYPE=”TEXT” NAME=”cod_acasa”></TD>
</TR>
<TR>
<TD>Telefon:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”telefon_birou”></TD>
<TD WIDTH=”20”> </TD>
<TD> </TD>
<TD><INPUT TYPE=”TEXT” NAME=”telefon_acasa”></TD>
</TR>
<TR>
<TD>Data nasterii:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”data_nastere”></TD>
</TR>
<TR>
<TD>Numele sotului/sotiei:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”nume_sot”></TD>
<TD WIDTH=”20”> </TD>
<TD>Numele copiilor:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”copii”></TD>
</TR>
<TR>
<TD>Ziua nuntii:</TD>
<TD><INPUT TYPE=”TEXT” NAME=”zi_nunta”></TD>
</TR>
</TABLE>
<BR>
<BR>
<BR>
<INPUT TYPE=”SUBMIT” VALUE=”Trimite”>
<BR>
<BR>
<INPUT TYPE=”RESET” VALUE=”Sterge datele”>
</FORM>
</BODY>
</HTML>
3. Dedicati un interval de timp studiului scriptului PHP, acordand o atentie
speciala modului de utilizarea instructiunilor conditionale pentru validarea
datelor din formular.
4. Orientati un browser Web spre adresa URL a fisierului HTML incarcat
anterior. Ecranul browserului trebuie sa fie asemanator celui prezentat in
figura 6-1. Introduceti valori in mai multe campuri si apoi executati
clic pe butonul „Trimite".
<figura 6-1>Formularul de introducere a datelor pentru proiectul 6-2.
< ecran> Contact Information
<campuri>
Nickname:
Title:
Fisrt name:
Middle name:
Last name:
Primary Email: Secondary Email:
Company Name:
Office address: Home address:
City:
State:
Zip:
Phone:
Birthday:
Spouse name: Childres Names:
Anniversary:
</campuri>
<buton>Submit </buton>
<buton>Clear the form </buton>
</figura 6-1>
5. La executarea scriptului, acesta verifica daca porecla, prenumele, numele
si adresa de e-mail exista; daca vreunul din aceste campuri lipseste,
scriptul afiseaza un mesaj de eroare. Un rezultat caracteristic este prezentat
in figura 6-2.
<figura 6-2> Datele de iesire ale proiectului 6-2, afisand erorile
de validare.
Nickname is required.
First same is required.
Last name is required.
Primary email address is required.
Please use your browser's back button to return to tbe form, correct the errors,
and re-submit the form.
</figura 6-2>
<Test de evaluare>
1. Scrieti o instructiune if care atribuie variabilei $y valoarea l daca variabila
$x are valoarea l, in caz contrar atribuind variabilei $y valoarea 2.
2. Scrieti o instructiune switch care atribuie valoarea 5 variabilei $y daca
variabila $x are valoarea l, respectiv valoarea 15 daca variabila $x are valoarea
2, valoa¬rea 20 daca variabila $x are valoarea 3, valoarea -1 in celelalte
situarii.
3. Scrieti o bucla for care are ca date de iesire o serie de asteriscuri; numarul
asteriscurilor trebuie sa fie dat de valoarea variabilei $stele.
4. Scrieti o instructiune if care atribuie variabilei $y valoarea l daca variabila
$x are valoarea l, respectiv valoarea 3 daca variabila $x are valoarea 2, valoarea
5 daca variabila $x are valoarea 3, valoarea -l in celelalte situarii.
</Test de evaluare>