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:
{
instructiune #1
instructiune #2
...
instructiune #n
}
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;
Despre functii in PHP
In PHP 4 functiile pot fi definite de catre utilizator folosind urmatoarea sintaxa:
function numef ($param1, $param2, ..., $paramN) {
// instructiuni
}
In PHP4 o functie poate fi definita oriunde in cadrul script-ului si in interiorul unei functii poate sa apara orice secventa valida de cod care include definirea de alte functii si definitii de clase. Argumentele unei functii trebuie separate prin virgula, si, implicit, acestea sunt transmise prin valoare. Pentru ca functia sa returneze un rezultat se foloseste constructia return care primeste ca parametru o expresie care reprezinta valoarea functiei. In momentul in care este intalnita constructia return, executia functiei se incheie. In exemplul urmator se calculeaza cu ajutorul unei functii PHP, patratul unui numar.
Exemplu
<?php
function patrat ($n) {
return $n * $n;
}
echo "4^2=<b>".patrat(4)."</b>";
?>
Rezultat
4^2=16
Transmiterea parametrilor prin referinta
Pentru a transmite parametri unei functii prin referinta, fapt care implica modificarea valorii parametrilor si pastrarea noii valori dupa ce executia functiei s-a incheiat, se foloseste operatorul "&" inaintea numelui parametrului formal, in momentul definirii functiei. Urmatorul exemplu indica modul in care se modifica valoarea unei variabile in interiorul unie functii si modul in care aceasta modificare este resimtita in exteriorul acesteia:
Exemplu
<?php
function modificInt ($s) {
$s .= " prima functie.";
echo "<b>In modificInt: </b>".$s."<br>";
}
function modificExt (&$s) {
$s .= " a doua functie.";
echo "<b>In modificExt: </b>".$s."<br>";
}
$s="Iesire din ";
echo "<b>In script: </b>".$s."<br>";
modificInt ($s);
echo "<b>In script: </b>".$s."<br>";
modificExt ($s);
echo "<b>In script: </b>".$s."<br>";
?>
Rezultat
In script: Iesire din
In modificInt: Iesire din prima functie.
In script: Iesire din
In modificExt: Iesire din a doua functie.
In script: Iesire din a doua functie.
Nu exista posibilitatea de supraincarcare a unei functii, de redefinire a ei dupa ce aceasta a fost definita in cadrul scriptului respectiv si nu exista nici posibilitatea de anulare a unei functii. O functie poate fi apelata inainte de definirea ei.
Parametri cu valori implicite
In PHP parametrii formali pot avea valori implicite, si, in cazul in care parametrul actual lipseste, atunci se va considera ca are valoarea implicita. Urmatorul exemplu ilustreaza modul de folosire al functiilor cand acestea au parametri formali cu valori implicite:
Exemplu
<?php
function comanda ($s="cafea") {
return "Ati comandat ".$s.".";
}
echo comanda();
echo "<br>";
echo comanda ("suc");
?>
Rezultat
Ati comandat cafea.
Ati comandat suc.
In cazul in care se folosesc parametri cu valori implicite este necesar ca orice parametru care are o valoare implicita sa se afle in partea dreapta a tuturor parametrilor pentru care nu se folosesc valori implicite, in caz contrar interpretorul PHP nu poate sa decida carui parametru sa-i atribuie valoarea de pe o anumita pozitie din lista de parametri. De exemplu, daca avem o functie a carei declaratie este function transform ($baza=10, $nr) si care returneaza rezultatul transformarii lui $nr din baza 16 in baza $baza, a carei valoare implicita este 10, daca se apeleaza transform (50), interpretorul nu atribuie valoarea 50 parametrului $nr, ci parametrului $baza si genereaza o eroare deoarece lipseste valoarea parametrului $nr.
Functii cu numar variabil de parametri
O alta facilitate a limbajului PHP este aceea ca ofera programatorului posibilitatea de a utiliza functii care au un numar nedeterminat de parametri. Functiile care folosesc un numar variabil de parametri nu au nici o particularitate in ceea ce priveste definirea lor. Aceste functii se definesc la fel ca cele prezentate anterior, dar pentru a putea accesa parametri se vor folosi urmatoarele functii predefinite:
- func_num_args ( ) - aceasta functie returneaza numarul parametrilor functiei care a apelat-o; daca aceasta functie este apelata din exteriorul unei functii definite de utilizator se va genera un mesaj de avertizare;
- func_get_arg (arg_num) - returneaza valoarea parametrului care se afla pe pozitia arg_num in lista de parametri; primul parametru are numarul de ordine 0; daca este apelata din exteriorul unei functii definite de utilizator se va genera un mesaj de avertizare;
- func_get_args ( ) - returneaza un tablou unidimensional care contine valorile parametrilor pe care functia apelanta i-a primit; daca aceasta functie este apelata din exteriorul unei functii definite de utilizator se va genera un mesaj de avertizare. In continuare aveti 2 exemple de utilizare a acestor functii. Primul exemplu afiseaza lista parametrilor functiei folosind functia func_num_args si func_get_arg, iar al doilea exemplu afiseaza aceeasi lista folosind numai functia func_get_args.
Exemplu
<?php
function lista_parametri ( ) {
for ($i=0; $i<func_num_args ( ); $i++) {
print_r (func_get_arg ($i));
echo "<br>";
}
}
echo lista_parametri ("Comanda:", 1, "calculator", 2, "procesoare", "configuratie", array ("local", 2, 3));
?>
Rezultat
Comanda:
1
calculator
2
procesoare
configuratie
Array ( [0] => local [1] => 2 [2] => 3 )
Exemplu:
<?php
function lista_parametrii ( ) {
foreach (func_get_args () as $i) {
print_r ($i);
echo "<br>";
}
}
echo lista_parametrii ("Comanda:", 1, "calculator", 2, "procesoare", "configuratie", array ("local", 2, 3));
Rezultat
Comanda:
1
calculator
2
procesoare
configuratie
Array ( [0] => local [1] => 2 [2] => 3 )
Valorile returnate de functii
Rezultatul obtinut dupa apelarea unei functii poate avea orice tip. O functie poate sa returneze chiar si liste sau obiecte. In PHP exista un caz special de rezultat numit referinta. Pentru ca o functie sa poata returna o referinta, aceasta trebuie declarata folosindu-se operatorul '&' inaintea numelui functiei. Acest operator trebuie sa apara inaintea numelui functiei si in momentul cand o variabila primeste ca valoare referinta rezultata din apelul functiei. In exemplul urmator se defineste o functie al carui rezultat il constituie o referinta:
Exemplu
<?php
function &refer ( ) {
global $s;
return $s;
}
$s = "Acesta este continutul variabilei referite cu ajutorul functiei.";
$z = &refer ( );
echo $z;
?>
Rezultat
Acesta este continutul variabilei referite cu ajutorul functiei.
Spre deosebire de majoritatea limbajelor de programare moderne, o functie PHP poate sa returneze o referinta la o variabila care a fost declarata in interiorul functiei, insa acest lucru nu este indicat deoarece, in anumite cazuri, poate duce la efecte neasteptate ale executarii unui script PHP. In alte limbaje de programare efectele devin uneori fatale.
Variabilele de tip functie
O alta facilitate a limbajului PHP in ceea ce priveste functiile este aceea ca suporta variabile de tip functie. Acest lucru este util atunci cand se folosesc liste de functii pentru prelucrarea anumitor tipuri de date. Pentru a atribui un nume de functie unei variabile in PHP se foloseste aceeasi constructie ca in cazul atribuirii unui sir de caractere, si anume, o variabila va primi ca valoare numele functiei scris intre ghilimele simple sau duble. In cazul in care interpretorul PHP gaseste un nume de variabila urmata de o lista de parametri, acesta cauta functia pe care variabila o refera si in cazul in care exista, o executa. Variabilele de tip functie nu functioneaza cu constructii ale limbajului ca echo, unset, isset, empty, include etc. Mai jos aveti un exemplu care ilustreaza modul de lucru cu variabilele de tip functie.
Exemplu
<?php
function produs ($a, $b) {
return $a * $b ;
}
function suma ($a, $b) {
return $a + $b;
}
$operatie = 'produs';
$rez = $operatie (4, 5);
echo "4 * 5 = <b>".$rez."</b><br>";
$operatie = 'suma';
$rez = $operatie (4, 5);
echo "4 + 5 = <b>".$rez."</b><br>";
?>
Rezultat
4 * 5 = 20
4 + 5 = 9