Sunteți pe pagina 1din 140

UNIVERSITATEA TRANSILVANIA DIN BRAOV

Centrul de nvmnt la Distan


i nvmnt cu Frecven Redus
FACULTATEA DE MATEMATIC I INFORMATIC
PROGRAM DE LICEN: INFORMATIC

Dezvoltarea aplicaiilor Web cu PHP i Smarty


CURS PENTRU NVMNT LA DISTAN

AUTORI: Conf. Dr. Silviu Dumitrescu

ANUL III
2012-2013

Prerechizite
Programare Orientata pe Obiect
1.
2.
3.

4.
5.

Definiti conceptul obiect si enumerati cateva caracteristici ale sale.


Definiti conceptul de clasa. Din punct de vedere structural, prin ce este descrisa o clasa? Cate tipuri de
clase cunoasteti?
Cele trei mari concepte in programarea orientata pe obiecte sunt incapsularea, polimorfismul si mostenirea.
Incapsularea este principiul conform caruia un obiect trebuie sa aiba interfata complet separate de
implementare. La ce se refera celelalte doua concepte?
Abstractizarea este procesul prin care se identific i se re in numai caracteristicile esen iale ale realit ii
modelate Ce problema(e) rezolva abstractizarea si incapsularea?
Ce reprezinta polimorfismul?

Baze de date
1.
2.
3.
4.
5.

Ce este o baza de date? Dati exemple ce baze de date ati utilizat sau cunaosteti.
O baza de date relationala este o baza de date ce respecta modelul relational dezvoltat de Dr. E.F. Codd.
Enumerati cateva caracteristici ale modelului.
Componentele de baza ale unei baze de date relationale sunt tabelele si relatiile. Enumerati cateva
caracteristici ale lor si dati exemple de relatii din viata reala.
Exist trei probleme care pot ap rea n tabelele f normalizare din bazele de date rela ionale: anomalia de
inserare, de stergere, de actualizare. Enumerati avantajele normalizarii unei baze de date relationare.
Pentru inserarea datelor intr-o tabela din MySQL ce instructiune ati folosi? Dati un exemplu din viata reala.
Vizualizarea datelor din tabel se face utilizand comanda SELECT. Care este sintaxa ei?

CUPRINS:
Introducere

Modulul 1. Concepte introductive despre PHP


Unitatea de nv are M1.U1.
Primul script PHP. Sintaxa de baza. Tipuri de date PHP

Unitatea de nv are M1.U2. Structuri de control. Functii PHP

Modulul 2. Formulare. Sesiuni


Unitatea de nv are M2.U1. Preluarea datelor dintr-un formular

Unitatea de nv are M2.U2. Sesiuni

Modulul 3. Lucrul cu fisiere


Unitatea de nv are M3.U1. Operatii cu fisiere. Gestionarea fisierelor

Modulul 4. Programare Orientata pe Obiecte in PHP


Unitatea de nv are M4.U1. Clase si obiecte in PHP5

Unitatea de nv are M4.U2. Exceptii

Modulul 5. Persistenta datelor cu PHP


Unitatea de nv are M5.U1. Persistenta datelor cu PHP

Bibliografie
Raspunsuri

Introducere
Ini ial, PHP a fost acronimul de la Personal Home Page, dar a fost modificat pentru a se alinia
conversiei de nume a sistemului de operare GNU1 i acum reprezint acronimul pentru PHP
Hypertext Preprocessor.
Pentru a ntelege la ce i de ce folosim limbajul PHP vom da n continuare cteva dintre
principalele sale caracteristici:
este un limbaj de script, adic un limbaj de programare ce permite controlul uneia sau
mai multor aplica ii software, i este folosit pentru crearea aplica iilor web dinamice.
Spre exemplu, codul surs PHP poate fi inclus n cod HTML2 sau poate fi cod gazd
pentru cod HTML;
este un limbaj server-side, adic opera iile cerute de client se execut pe un server. n
cazul PHP-ului, server-ul, cunoscut i sub numele de web server, reprezint un
program software ce ruleaz pe un calculator ce poate fi accesat de c tre calculatorul
client. Opera iile se execut server-side pentru c pe calculatorul client nu exist
resursele necesare execut rii acestora;
pentru a rula o aplica ie PHP avem nevoie a adar de un server web pe care avem
instalat interpretorul PHP, reprezentat de CGI3 sau un modul de server, precum i de
un navigator web instalat pe calculatorul client. Codul surs PHP este interpretat de
server-ul web, care genereaz cod HTML, cod ce va fi vizualizat de client prin
intermediul navigatorului;
include n nucleul de baz libr rii open source, adic colec ii de func ii a c ror
implementare poate fi modificat i redistribuit ;
este free software, adic utilizarea sa este gratuit ;
are module predefinite pentru accesul FTP4 al server-elor, pentru accesul la servere de
baze de date, amd;
poate fi folosit pe aproape toate sistemele de operare, incluznd Linux, multe variante
de Unix, Microsoft Windows, Mac OS X sau RISC OS;
Obiectivele cursului
Cursul intitulat Fundamentele dezvoltarii aplicatiilor WEB cu PHP ncepe prin a
descrie modul de func ionare a limbajului PHP, apoi trece la detalierea modului de
creare si de nc rcare a programelor PHP.
Cele cinci module ale cursului abordeaz n mod controlat o prezentare gradat a
conceptelor folosite n activitatea de programare i a elementelor specifice
limbajului PHP. Fiecare modul con ine elemente destinate a remprosp ta memoria
i n elegerea cititorului.
La sfr itul acestui curs, studentul va fi capabil s :
opereze cu no iuni precum: administrarea proceselor, gestiunea memoriei
1

GNU reprezint acronimul recursiv pentru GNU Nu-i Unix


HTML HyperText Markup Language
3
CGI - The Common Gateway Interface, reprezint un protocol prin care soft-urile externe apeleaz un server web pentru a ob ine con inut
dinamic.
4
FTP File Transfer Protocol
2

interne, gestiunea fi ierelor, administrarea intr rilor i ie irilor;


recunoasca caracteristicile limbajului PHP;
opereze cu notiuni precum diverse tipuri de variabile, tipuri de date n PHP, cei
mai importan i operatori i posibilitatea de a i combina pentru a ob ine expresii,
structuri de control i modul n care ele sunt folosite n scripturile PHP pentru
crearea paginilor flexibile i dinamice,
foloseasca func ii, s le apeleze, s le declare i s le defineasca;
opereze cu elemente mai avansate: lucrul cu formulare, variabile superglobale,
cookie-uri i sesiuni.
cunoasca modul n care PHP implementeaz principalele caracteristici ale
program rii orientate pe obiect : clase, func ii, mo tenire, func ii magice i
compararea obiectelor.
trateze exceptii;
opereze cu notiuni de persistenta datelor.

Cerin e preliminare.
Studen ii trebuie s posede cuno tin e, deprinderi, abilit i ob inute n cadrul
cursurilor de Baze de date si Programare Orientata pe Obiecte.
Resurse.
Sisteme de calcul pe care s fie instalate:
un sistem de operare din familia Windows ;
Eclipse
Server PHP
MySQL
Structura cursului
Volumul este structurat n cinci module, care sunt formate din unit i de nv are.
La rndul s u, fiecare unitate de nv are cuprinde: obiective, aspecte teoretice
privind tematica unit ii de nv are respective, exemple, teste de evaluare precum
i probleme propuse spre discu ie i rezolvare.
Primul modul cuprinde doua unitati de nv are, in care am eviden iat cteva din
caracteristicile limbajului PHP. Am discutat despre diverse tipuri de variabile,
tipuri de date n PHP, despre c iva din cei mai importan i operatori i posibilitatea
de a i combina pentru a ob ine expresii. Am studiat apoi structurile de control i
modul n care ele sunt folosite n scripturile PHP pentru crearea paginilor flexibile
i dinamice, am discutat despre func ii, despre cum s le apel m, cum s le
declar m i cum s le definim. prin care cititorul este introdus n problematica
sistemelor de operare.
Al doilea modul continua cu elemente mai avansate: lucrul cu formulare, variabile
superglobale, cookie-uri i sesiuni.
Am f cut apoi un alt pas important n crearea paginilor web dinamice in al treilea
modul i anume organizarea fi ierelor surs astfel nct s permit solu ii flexibile
de navigare i validare. Am studiat modul n care PHP poate interac iona cu fi iere
externe aplica iei.

Un modul important este dedicat modului n care PHP implementeaz principalele


caracteristici ale program rii orientate pe obiect. Astfel, am discutat despre clase,
func ii, mo tenire, func ii magice i compararea obiectelor.
Partea final a cursului s-a referit la tratarea excep iilor i la persisten a datelor.
Discu iile au fost legate de gestiunea bazelor de date cu ajutorul conexiunii dintre
server-ul PHP i server-ul MySQL, func ii de conectare, func ii de expediere a
unor cereri i func ii de manipulare a rezultatului cererii.

Evaluarea va cuprinde att verificarea nsu irii cuno tiin elor teoretice prezentate,
ct i utilizarea practic a sistemelor de operare.

Modului 1. Concepte introductive despre PHP

Modulul 1. Concepte introductive despre PHP

Unitatea de nv are M1.U1.


Primul script PHP. Sintaxa de baza. Tipuri de date PHP
Cuprins:
M1.U1.1.
Obiectivele unit ii de nv are ..........................................................................1
M1.U1.2.
Primul script PHP..............................................................................................2
M1.U1.3.
HTML i PHP n acela i document ....................................................................4
M1.U1.4.
Comentarii n PHP ............................................................................................5
M1.U1.5.
Variabile PHP ...................................................................................................6
Variabile cu nume dinamic .................................................................................................7
M1.U1.6.
Tipuri de date ....................................................................................................7
Tipul boolean......................................................................................................................7
Tipul integer .......................................................................................................................8
Tipul float...........................................................................................................................8
Tipul string .........................................................................................................................8
Tipul array ..........................................................................................................................9
Tipul object ...................................................................................................................... 10
Tipul NULL ..................................................................................................................... 10
M1.U1.7.
Operatori i expresii ........................................................................................ 11
Operatori de atribuire ........................................................................................................ 11
Operatori aritmetici...........................................................................................................12
Operatori pe bi i................................................................................................................ 12
Operatori de comparare .................................................................................................... 12
Operatori de incrementare/decrementare ........................................................................... 13
Operatori logici.................................................................................................................13
Operator pentru controlul erorilor .....................................................................................14
Operator pe string-uri .......................................................................................................14
Operatori pe array-uri .......................................................................................................14
Operatori de cast ...............................................................................................................14
M1.U1.8.
Preceden a i asociativitatea operatorilor .........................................................15
M1.U1.9.
Constante ........................................................................................................ 15
M1.U1.1.
Test de evaluare a cuno tin elor .......................................................................16

M1.U1.1.
Obiectivele unit ii de nv are
Aceast unitate de nv are i propune ca obiectiv principal o introducere a
studen ilor n problematica scriptului PHP. La sfr itul acestei unit i de nv are
studen ii vor fi capabili s :
scrie cod HTML si PHP in acelasi document
sa creeze, incarce si ruleze un script PHP
sa utilizeze comentarii in PHP

Modului 1. Concepte introductive despre PHP


cunoasca sintaxa de baza
cunoasca diferite tipuri de variabile PHP
cunoasca diferite tipuri de date PHP
cunoasca operatori si expresii PHP
cunoasca precedenta si asociativitatea operatorilor
declare si sa foloseasca constante PHP

Durata medie de parcurgere a unit ii de nv are este de 4 ore.

M1.U1.2.
Primul script PHP
Pentru nceput cre m o aplica ie simpl ce va afi a textul: hello world! ntr-un browser
web.
a cum am anun at deja n Introducere, editarea este f cut n Eclipse. Pa ii care trebuie
urma i pentru aceasta sunt:
1. Deschiderea unui workspace. Recomand m ca workspace-ul s fie creat n directorul
htdocs (htdocs este spa iul de pe server-ul Apache n care se g sesc aplica iile PHP),
din pachetul xampp (xampp este chiar numele directorului n care a fost instalat
pachetul). n plus, pentru a evita intersectarea cu alte aplica ii deja existente
recomand m i crearea unui subdirector cu numele aplica iei curente. Noi am numit
acest director carte. (Recomand m, de asemenea, ca numele directorului s
foloseasc exclusiv acele caractere ASCII acceptate n adresele URL. Numele
directorului va apare n adresa web a paginilor aplica iei).
2. Crearea unui proiect. n Eclipse alegem din meniul File->New->PHP Project (acest
director este un subdirector al directorului aplica iei, carte, i trebuie s aib un nume
supus acelora i reguli ca i cel al aplica iei). Vom numi acest proiect exemplul21.
3. Crearea fi ierului surs . n Eclipse alegem File->New->PHP File. Denumim acest
fi ier, ex.php, innd cont de regula de nume anterior recomandat . Extensia pentru
fi ierele surs PHP este .php. Extensia este foarte important pentru c i transmite
server-ului faptul c acest fi ier con ine cod PHP i trebuie interpretat ca atare.
Edit m, n continuare, fi ierul:
<?php
echo "hello world!";
?>

4. nc rcarea i rularea aplica iei. Odat editarea ncheiat fi ierul trebuie nc rcat pe
server. Simpla salvare a fi ierului, datorit spa iului de lucru corect creat anterior,
determin nc rcarea acestuia pe server. n cazul Eclipse-ului nc rcarea pe server se
face automat, la rulare. La prima rulare ns n Eclipse, trebuie s cre m o configura ie
specific aplica iei curente. Apoi, simpla ac ionare a op iunii Run->Run As->PHP Web
Page determin rularea aplica iei pe baza configura iei anterior stabilite. Fereastra de
configurare se ob ine din Run->Run configurations i n cazul aplica iei noastre
trebuie sa aib urm torul con inut:

Modului 1. Concepte introductive despre PHP

Figure 1 - Crearea, managementul si rularea aplicatiei in Eclipse

Pentru c aplica ia nu se afl direct n directorul htdocs, ci ntr-un subdirector al


acestuia, vom modifica adresa URL a aplica iei, de pe server, ac ionnd butonul
Configure din dreptul PHP Server.

Figure 2 - Configurarea serverului

5. Dup rulare, con inutul fi ierului, transformat n cod HTML, va fi afi at n browser.
Eclipse permite setarea tipului de browser. Aceasta poate fi facut din Window->Web
browser. Pagina va fi deschis cu browser-ul curent. n cazul aplica iei noastre
adresa URL va fi: http://localhost/carte/exemplul21/ex.php. localhost,
care desemneaz faptul c serverul se afl pe calculatorul curent. Uneori n locul
cuvntului rezervat localhost putem folosi adresa 127.0.0.1. Dac serverul se afl
pe un alt calculator, n loc de localhost vom introduce adresa IP1 a acestuia.
a dup cum am observat n algoritmul de editare prezentat anterior, codul PHP a fost
delimitat de dou marcatoare, unul de nceput i unul de sfrsit. n mod predefinit acestea sunt
<?php respectiv ?>. Avem ns la dispozi ie mai multe posibilit i de marcare a codului PHP.
Unele sunt date n Exemplul 1.
Exemplul 1. Moduri de marcare a codului PHP
<?php
echo "hello world!";
?>
------------------------<SCRIPT LANGUAGE="php">
1

IP Internet Protocol

Modului 1. Concepte introductive despre PHP


echo "hello world!";
</SCRIPT>
------------------------<?
echo "hello world!";
?>

Primele dou sunt predefinite i unanim acceptate. Din cauza sintaxei greoaie,
cea de-a doua este mai rar ntrebuin at . Ce-a de-a treia nu este ntotdeauna
acceptat . Ea poate fi activat sau nu din fi ierul php.ini. Exist i o a patra
variant , folosind tag-uri ASP, dar aceasta nu este recomandat , mai mult, ea
trebuie explicit activat n php.ini.
n Exemplul 1 am folosit func ia echo, ce determin afi area n browser, sub forma
unui ir de caractere, a parametrilor s i.
O instruc iune PHP se termin de obicei cu caracterul ; (punct i virgul ). Excep iile de la
aceast regul vor fi discutate n capitolele urm toare. n cele mai multe cazuri dac omitem
; interpretorul va returna o eroare.

M1.U1.3.
HTML i PHP n acela i document
Pentru c att HTML ct i PHP sunt limbaje de script, putem include cod PHP n cod HTML
i invers. n oricare dintre cazuri fi ierul va trebui sa aib extensia .php.
n primul caz includerea se face prin intermediul marcatorilor nainte aminti i (Exemplul 2).
Cazul invers, al includerii codului HTML ntr-un bloc PHP, va fi descris n capitolele
urm toare.
Exemplul 2. Cod PHP inclus ntr-un script HTML
<html>
<head>
<title>
Exemplul 2: Cod PHP inclus intr-un script HTML
</title>
</head>
<body>
<b>
<?php
echo "hello world!";
?>
</b>
</body>
</html>

Rezultatul este un text formatat, prin ngro area literelor. Dac n browser am vizualiza codul
surs al paginii, atunci ceea ce am ob ine ar fi cod pur HTML.
ntr-un fi ier putem serializa oricte blocuri de cod PHP avnd cod HTML intercalat.

Modului 1. Concepte introductive despre PHP


M1.U1.4.
Comentarii n PHP
n general, comentariile sunt folosite pentru a face codul surs mai u or de n eles sau pentru a
delimita zone de cod gre ite sau inutile. Comentariile reprezint zone de cod ce nu vor fi luate
n considerare de c tre intrepretor. Din acest motiv con inutul comentariilor, ca sintax i
semantic , st n responsabilitatea programatorului, singurele restric ii fiind includerea
marcatorilor pentru comentarii.
n PHP pentru delimitarea comentariilor se folosesc caracterele // (dublu slash), sau #
(diez). Tot textul care urmeaz acestor caractere (pn la sfr itul liniei) reprezint un
comentariu. Pentru a comenta mai multe linii se folose te perechea de marcatori /* si */.
Exemplul 3. Cod PHP cu comentarii
<?
// Acesta este primul meu comentariu
# si acesta este un comentariu pe o linie
/*
tot ce scriem intre aceste simboluri este
un comentariu si nu va avea efect la executarea
programului.
*/
echo "hello world!";
?>

nlocui i zona punctat cu termenii corespunz tori.


1. PHP limbaj de scripting ............. bazat de motorul ......... Este in primul rand
folosit pentru a dezvolta continut ............ dinamic, desi poate fi folosit si pentru a
genera documente ............(printre altele).
a. dinamic, PHP, baza de date, HTML
b. embedded, Zend, HTML, XML
c. embedded, Zend, Docbook, MySQL
d. Zend, PHP, Image, HTML
2. In afara de a furniza nume descriptive fisierelor ce contin . dumneavoastra
PHP, e necesar sa includeti in interiorul fiecarui script atat . care sa
permita unui cititor sa determine cu usurinta utilitatea scriptului, cat si alte
informatii referitoare la script.
3. Pentru a adauga un .. alcatuit din mai multe linii, scrieti la inceput
caracterele . , iar la sfarsit trebuie sa se incheie cu caracterele .. Intre cele
doua perechi de caractere, puteti scrie orice text doriti, folosind oricate linii doriti.
4. Dupa ce v-ati incarcat fisierul cu scriptul, sunteti pregatit pentru a obtine
accesul la acesta. Deschideti . Web si apelati .. . asociata
scriptului dumneavoastra. Adresa URL trebuie sa fie alcatuita din adresa URL
identificata de administratorul serverului unde ati incarcat .. , urmata de
un , urmata de numele fisierului care contine scriptul dumneavoastra.
Daca adresa URL se incheie deja cu un caracter slash, nu trebuie sa mai inserati
inca un asemenea caracter inainte de numele scriptului dumneavoastra.

Modului 1. Concepte introductive despre PHP


M1.U1.5.
Variabile PHP
n general, o variabil reprezint un container special identificat printr-un nume i care
nmagazineaz o valoare.
Din punct de vedere sintactic numele este un identificator, adic o succesiune de litere, cifre
sau liniu a de subliniere (underscore), dar ntotdeauna primul caracter este litera sau liniu a de
subliniere. n plus, n PHP identificatorul unei variabile este precedat ntotdeauna de semnul
dolar ($).
Din punct de vedere semantic n spatele numelui unei variabile se afl adresa de memorie la
care aceasta este depozitat .
Observatia 1. Numele unei variabile n PHP este case-sensitive, adic se face deosebirea ntre literele mari i
cele mici. Spre exemplu $var i $Var reprezint dou variabile distincte.
Exemplul 4. Nume de variabile
$a;
$var;
$numeTitularCont;
$123; //nume invalid, incepe cu o cifra;
$_alpha1;
//nume valid;

Pentru a folosi o variabil trebuie n prealabil s o definim. n general, definirea cuprinde


dou etape, uneori suprapuse, i anume declararea variabilei i ini ializarea acesteia. La
declarare asociem variabilei un tip, iar la ini ializare o valoare.
Spre deosebire de alte limbaje de programare n PHP nu exist o sec iune de definire a
variabilelor. Declararea i ini ializarea se pot face oriunde n program, i pot fi considerate ca
dou procese distincte.
Pentru c n PHP nu exist cuvinte rezervate pentru tipuri, variabilei i se asociaz un tip n
momentul ini ializ rii dup tipul valorii cu care a fost ini ializat .
Pe lng tip i valoare, o alt caracteristic important a unei variabile este domeniul de
vizibilitate care, n mod predefinit, este contextul n care a fost definit . Prin context
n elegem fi ierul curent sau blocul de definire al unei func ii. Putem modifica domeniul de
vizibilitate utiliznd, spre exemplu, cuvntul rezervat global. Exemple i alte posibilit i de
modificare a domeniului de vizibilitate vor fi date n capitolele urm toare.
Variabilele n PHP sunt n mod predefinit alocate prin valoare, adic fiec rui nume de
variabil i corespunde o zon distinct (independent ) de memorie. Ilustr m ultima afirma ie
prin Exemplul 5:
Exemplul 5. Atribuirea de valori variabilelor
$var1 = 'mere'; //variabila $var1 con ine textul 'mere'
$var2 = $var1;
//variabila $var2 con ine de asemenea
textul 'mere'
$var2 = 'pere'; //variabila $var2 con ine textul 'pere'
//continutul variabilei $var1 ramane tot
'mere'

Pe lng acest mod de alocare, ncepnd cu PHP4, avem i alocarea variabilelor prin referin .
Aceasta nseamn c noua variabil refer (indic ) aceea i adres ca i variabila original .
6

Modului 1. Concepte introductive despre PHP


Altfel spus este un sinomin al aceleia i adrese. Modific rile f cute noii variabile vor afecta i
con inutul variabilei originale i invers. Pentru o astfel de atribuire se folose te operatorul de
adresare & ata at numelui variabilei din membrul drept. Exemplul 6 i Exemplul 7 sus in cele
mai sus men ionate.
Exemplul 6. Atribuire de valori variabilelor prin referin
$a='rosu'; //variabila $a contine textul 'ro u'
$b=&$a;
//variabila $b refera variabila $a
//va contine tot textul 'rosu'
$b='verde';//variabila $b va contine textul 'verde'
//variabila $a de asemenea
Exemplul 7. Atribuire prin referin incorect
$y=&(25+18); //atribuire incorecta, variabila nu are nume
valid

Variabile cu nume dinamic


n PHP chiar numele unei variabile poate fi stocat ntr-o variabil , iar procesul este iterativ.
Exemplul 8. Variabile cu nume dinamic
$hello = "world"; //variabila cu numele hello contine
textul world
//Putem scrie echivalent:
$a = "hello";
//numele variabilei hello il atribuim
variabilei a
$$a = "world";
//continutul variabilei hello va fi
textul world
Observa ia 2: Se poate folosi un ir constant pentru a defini o variabil cu nume dinamic n loc
de a folosi o variabil . Pentru aceasta, avem urm toarea sintaxa:
${"hello"} = "world";

M1.U1.6.
Tipuri de date
PHP folose te, n mod curent, urm toarele categorii de tipuri de date. Tipurile din categorii nu
reprezint cuvinte cheie PHP:
Tipuri scalare reprezentate de:
boolean
integer
float
string
Tipuri compuse
array
object
Tip generic
NULL.
Tipul boolean
O variabil de tip boolean poate avea doar dou valori, reprezentate de cuvinte rezervate PHP:
TRUE respectiv FALSE. n plus, ca i n limbajul C, orice valoare 0, ir vid sau NULL nseamn
FALSE, iar orice alt valoare nseamn TRUE.

Modului 1. Concepte introductive despre PHP


Exemplul 9. Variabile de tip boolean
ce au valoare TRUE explicit sau prin conversie implicit
$var = TRUE;
$var = 1;
$var = -1;
ce au valoarea FALSE
$var = FALSE;
$var = 0;
$var = ""; //sirul vid

Tipul integer
Variabilele de tip integer sunt numere ntregi reprezentate, n general, pe patru octe i.
Lungimea reprezent rii, i de aici i domeniul de valori, este dependent ns de platform . Ea
poate fi aflat prin valoarea variabilei predefinite PHP_INT_SIZE. Valorile asociate tipului
integer pot fi zecimale(succesiune de cifre de la 0 la 9, eventual semn), hexazecimale
(precedate de 0x i succesiune de cifre de la 0 la 9 i literele a, A, b, B, c, C, d, D, e, E, f, F,
eventual semn) sau octale(precedate de 0 i succesiune de cifre de la 0 la 7, eventual semn).
Exemplul 10.
$var =
$var =
$var =
$var =

Variabile de tip integer


1234; //numar intreg
-123; //numar intreg
0123; //numar intreg
0x1AB; //numar intreg

zecimal
negativ
in format octal
in format hexazecimal

Tipul float
Desemneaz numerele reale reprezentate n virgul mobil , care pot fi specificate folosind
oricare dintre sintaxele urm toare:
Exemplul 11.
Variabile de tip float
$var = 1.23;
$var = 1.2e3; //formatul stiintific
$var = -7E-10;

Tipul string
Tipul string reprezint iruri de caractere ASCII. Aceasta nseamn doar 256 de caractere
posibil a fi reprezentate. Pn n prezent, n variantele stabile, PHP nu are suport pentru
caractere Unicode.
Exist mai multe moduri de reprezentare extern a valorii variabilelor de tip string, dar numai
2 sunt folosite n mod uzual:
reprezentarea cu ghilimele simple: $var = 'Acesta este un string';
reprezentarea cu ghilimele duble: $var = "Acesta este un string";
Observatia 2. n cazul primei modalit i de reprezentare pentru afi area caracterului apostrof, n cadrul
textului, acesta trebuie precedat de caracterul backslash (\'). La fel se procedeaz pentru afi area caracterului
backslash (\\). Folosirea oric ror alte secven e escape determin i afi area caracterului backslash.
Exemplul 12.
Variabile de tip string reprezentate ntre apostrofuri
$var = 'Andrei a raspuns: "Acu\'!" ';
//Va afisa: Andrei a raspuns: "Acu'!"

Modului 1. Concepte introductive despre PHP


Observatia 3. Cea de-a doua modalitate permite interpretarea tuturor secven elor escape (Tabelul 1). Mai
mult, dac n cadrul textului apare o variabil , aceasta va fi nlocuit cu valoarea sa (Exemplul 13).

Secven
escape
\n

Interpretare

linie nou (line feed)


ntoarcere la nceputul liniei (carriage
\r
return)
\t
Tab
\\
Backslash
\$
semnul dolar
\"
Ghilimele
Tabelul 1: Secven e escape acceptate n interiorul string-urilor
Exemplul 13.
Variabile de tip string reprezentate ntre ghilimele
$a = 40;
$b = "Sunt $a participanti prezenti in clasa.";
//Va afisa: Sunt 40 participanti prezenti n clasa.

Una dintre opera iile frecvent utilizate cu string-uri este concatenarea. Aceasta se realizeaz
prin intermediul operatorului punct (Exemplul 14). Despre alte opera ii pe string-uri vom
discuta n capitolele urm toare.
Exemplul 14.
Concatenarea a dou string-uri
/* Atribuirea unei valori de tip string. */
$str = "Acesta este un string";
/* concatenarea a doua string-uri. */
$str = $str . " cu ceva mai mult text";

Tipul array
n general, acest tip de date este cunoscut sub numele de tip tablou sau ir i reprezint o
structur ordonat cu una sau mai multe dimensiuni.
n PHP datele con inute ntr-un array pot fi de tipuri diferite. Logica unei astfel de structuri n
PHP este c fiec rui element i se asociaz o cheie i o valoare. Astfel, aceast structur aduce
o anumit generalitate fa de un tablou clasic i metode de acces diferit la date. Prin acest tip
putem defini stive, cozi, liste, colec ii, hash-uri, matrici sau vectori.
PHP ofer mai multe posibilit i de a construi o variabil de tip array:
- Sintaxa cu paranteze drepte:
$nume_array[cheie] = valoare;

unde: cheie poate fi de tip string, integer nenegativ sau poate lipsi;
valoare o valoare de orice tip de dat .
Exemplul 15.
Atribuirea de valori unui array
$a[0] = "abc"; //elementul de indice
valoarea abc
$a[1] = "def"; //elementul de indice
valoarea def
$b["sir"] = 13;//elementul de cheie
valoarea 13
$a[] = "hello";//elementul de indice
valoarea hello

din

primeste

din

primeste

ir din b primeste
2

din

primeste

Modului 1. Concepte introductive despre PHP


$b[] = "world";//elementul
valoarea world

de

indice

din

primeste

a cum reiese din Exemplul 15 lipsa explicit a cheii determin crearea unui nou
element, n ir, de indice egal cu ultimul indice + 1 sau de indice 0 dac nu a existat
vreunul creat deja. Astfel, n cazul lui b nu exist un indice explicit a a c a fost creat
primul, de valoare 0.
Sintaxa folosind func ia predefinit array():
$nume_array = array (cheie => valoare, ...);

cu semnifica iile date anterior.


Exemplul 16.
Definirea unui array folosind func ia array()
$a = array('culoare' => 'rosu', 'gust' => 'dulce', 'forma'
=> 'rotund', 'nume' => 'mar', 4);
// echivalent cu
$a['culoare'] = 'rosu';
$a['gust'] = 'dulce';
$a['form '] = 'rotund';
$a['nume'] = 'mar';
$a[] = 4; // cheia este 0
//sau
$b[] = 'a';
$b[] = 'b';
$b[] = 'c';
// echivalent cu
$b = array( 0 => 'a' , 1 => 'b' , 2 => 'c');
// sau mai simplu
$b = array('a', 'b', 'c');

Referirea la o variabil de tip tablou se face prin numele tabloului, iar la un element din tablou
prin nume i cheia sau indicele cuprinse de paranteze drepte.
Referitor la tablouri exist multe func ii i operatori care s le modifice i controleze starea
(vezi paragraful dedicat operatorilor sau capitolele urm toare).
Tipul object
O variabil de tip object se ob ine prin crearea unei instan e a unei clase (vezi capitolul
dedicat claselor i obiectelor).
Tipul NULL
Are o singur valoare i anume NULL. O variabil de tip NULL reprezint o variabil f
o valoare.
Sintaxa de atribuire a acestei valori unei variabile este urm toarea:
$a = NULL;

10

nici

Modului 1. Concepte introductive despre PHP


ne reamintim...
Programele PHP folosesc doua categorii principale de date: numere si siruri.
Numerele sunt compuse mai ales din cifre, n timp ce un sir poate contine orice
caracter, inclusiv cifre, litere si simboluri speciale.
Aceste doua mari categorii de date: numere si siruri, formeaza urmatoarele tipuri
principale de variabile :
Boolean
Integer
Float
String
Array
Object
Null
In mod normal tipul variabilelor nu este specificat explicit; acesta va fi evaluat de
catre interpretorul PHP la momentul run-time (in momentul executarii scriptului).
nlocui i zona punctat cu termenii corespunz tori.
1. Variabilelele de tipul boolean pot lua doar doua valori : . sau ..
.
2. Variabilele . reprezinta numerele intregi, ele pot fi specificate in
format. , hexazecimal sau.
3. Spre deosebire de ntregi si de numere float, care contin cifre, . pot
contine orice caracter. Ca atare, sunt utile pentru stocarea datelor
care nu pot fi calculate, precum nume, fraze si adrese.
4. Daca intr-un sir delimitat prin .. duble vrem ca acesta sa afiseze
numele unei variabile, nu acesteia, adaugam un caracter
backslash (\).. numelui variabiei.
5. O variabila se considera a avea valoarea . daca:
- este setata explicit prin atribuirea valorii NULL
- nu a fost asignata inca o . acestei variabile
- variabila a fost stearsa prin functia.. ;
6. Tipul reprezinta o insiruire de caractere, fiecare . este
memorat pe 1 byte; setul de caractere este limitat la .. valori distincte.
Dimensiunea sirurilor poate fi oricat de in PHP, nu exista specificatii care
sa limiteze numarul maxim de caractere dintr-un sir.

M1.U1.7.
Operatori i expresii
Operatorii sunt simboluri care fac posibil folosirea uneia sau a mai multor valori pentru a
crea o nou valoare. O valoare care este operat de c tre un operator se nume te operand.
O expresie este orice combina ie valid de func ii, valori i operatori cu scopul de a ob ine o
nou valoare.
Principalii operatori ai limbajului PHP vor fi analiza i n continuare.
Operatori de atribuire
Pn acum am folosit operatorul de atribuire pentru ini ializarea variabilelor. Sintaxa de baz
pentru atribuire este:

11

Modului 1. Concepte introductive despre PHP

$variab = expresie;

Modul de execu ie este urm torul: se evalueaz expresia iar valoarea este atribuit variabilei
din membrul stng.
Pe lnga acesta exist
(Exemplul 17).

i operatorii de atribuire compu i, pentru aproape toate opera iile

Exemplul 17.
Utilizarea operatorilor de atribuire compu i
$a = 3;
$a += 5; // seteaza $a cu valoarea 8, ca si cum am fi scris
:
// $a = $a + 5;
$b = "Hello ";
$b .= "world!"; // seteaza $b cu valoarea "Hello world!"
// echivalent cu $b = $b . "world!";

Operatori aritmetici
Operatorii aritmetici sunt folosi i n expresii aritmetice. n Tabelul 2 este prezentat lista
acestor operatori.

Nume
operator
adunare
sc dere
semn
nmultire

mpartire

modulo

Operator
+
-

Observa ii
Operator binar
Operator unar
Rezultatul este ntreg doar dac ambii operanzi sunt ntregi
sau convertibili la ntregi, iar rezultatul este f rest
Restul este returnat indiferent dac operanzii sunt float (se
face conversia la integer). Restul este negativ doar dac
operandul stng este negativ iar cel drept pozitiv.
Tabelul 2: Operatori aritmetici

Operatori pe bi i
Operanzii sunt, n general, numere ntregi, iar utilizarea lor este pentru cre terea vitezei de
execu ie a evalu rii.

Operator Exemplu
Nume operator
&
$a & $b
i, pe bi i
|
$a | $b
sau, pe bi i
^
$a ^ $b
sau exclusiv, pe bi i
~
~ $a
negare
<<
$a << $b shiftare stnga
>>
$a >> $b shiftare dreapta
Tabelul 3: Operatori pe bi i

Operatori de comparare
Operator

Nume
operator

Observa ii

==

egal

Returneaz 1(echivalentul lui TRUE) dac valoarea


operandului stng este egal cu cea a operandului drept i

12

Modului 1. Concepte introductive despre PHP


NULL (echivalentul lui FALSE) altfel.
Returneaz 1 dac valoarea operandului stng este egal
cu cea a operandului drept i sunt de acelasi tip, NULL
altfel.
Returneaz 1 dac valoarea operandului stng nu este
egal cu cea a operandului drept i NULL altfel. Diferen a
ntre cei doi operatori const n prioritate.
Returneaz 1 dac valoarea operandului stng nu este
egal cu cea a operandului drept sau nu sunt de acela i
tip, NULL altfel .

===

identic

!=
<>

diferit

!==

neidentic

<

mai mic

Returneaz 1 dac valoarea operandului stng este strict


mai mic dect cea a operandului drept i NULL altfel.

>

mai mare

Returneaz 1 dac valoarea operandului stng este strict


mai mare dect cea a operandului drept i NULL altfel.

<=

mai mic
egal

sau

Returneaz 1 dac valoarea operandului stng este mai


mic sau egal cu cea a operandului drept i NULL altfel.

>=

mai mare sau


egal

Returneaz 1 dac valoarea operandului stng este mai


mare sau egal cu cea a operandului drept i NULL altfel.

Tabelul 4: Operatori de comparare

Operatori de incrementare/decrementare
Operator
++
--

Nume operator

Observa ii
n func ie de momentul n care se face incrementarea avem
incrementare
pre-incrementare (++$a) i post-incrementare ($a++)
n func ie de momentul n care se face decrementarea avem
decrementare
pre-decrementare (--$a) i post-decrementare ($a--)
Tabelul 5: Operatori de incrementare/decrementare

Pentru a n elege diferen ele care exist ntre pre i post vom da urm torul exemplu.
Exemplul 18.
Utilizarea operatorilor de atribuire compu i
$a=1;
$b=2;
$c=$a++ + ++$b;

n Exemplul 18 dup executarea ultimei instruc iuni, $a va avea valoarea 2, $b va avea valoarea
3 iar $c valoarea 4 (ca suma dintre 1 i 3, $a a fost mai nti evaluat i apoi incrementat).
Operatori logici
Operator
and
&&
or
||
xor
!

Nume
operator
i
sau

Observa ii
Diferen a ntre cei doi operatori const
Tabelul 3)
Diferen a intre cei doi operatori const
Tabelul 3)

sau exclusiv
nega ie
Tabelul 6: Operatori logici

13

n prioritate (vezi
n prioritate (vezi

Modului 1. Concepte introductive despre PHP

Operator pentru controlul erorilor


Operatorul @ are rolul de a suprima afi area unor erori n timpul evalu rii unei expresii.
Exemplul 19.

Utilizarea operatorului pentru controlul erorilor

@$a=3/0;

Dac n Exemplul 19 operatorul @ nu ar ap rea n fa a atribuirii am avea afi at un mesaj de


eroare: division by zero.
Operator pe string-uri
Operatorul punct (.) este operatorul de concatenare a dou string-uri.
Operatori pe array-uri
Nume
operator

Observa ii

==

egal

Returneaz 1(echivalentul lui TRUE) dac valoarea operandului


stng este egal cu cea a operandului drept, nsemnnd egalit i pe
perechi cheie/valoare indiferent de ordine, i NULL (echivalentul lui
FALSE) altfel.

===

identic

Returneaz 1 dac valoarea operandului stng este egal cu cea a


operandului drept, elementele apar respectiv pe aceea i pozi ie i au
acela i tip, NULL altfel.

!=
<>

diferit

Returneaz 1 dac valoarea operandului stng nu este egal cu cea


a operandului drept i NULL altfel. Diferen a dintre cei doi
operatori este data de prioritate.

!==

neidentic

Returneaz 1 dac valoarea operandului stng nu este egal cu cea


a operandului drept, sau nu sunt de acela i tip, sau nu apar pe
aceea i pozi ie, NULL altfel.

reuniune

Operator

Adaug elemente operandului stng dintre cheile inexistente, aflate


n operandul drept, cu valorile corespunz toare. Cheile duplicat nu
vor fi suprascrise.
Tabelul 7: Operatori pe array-uri

Exemplul 20.
Utilizarea operatorului de reuniune pentru array-uri
$a=array(1=>"unu",2=>"doi","index"=>"trei");
$b=array(2=>"sase","index"=>9,8);
$a+=$b;

n Exemplul 20 $a va con ine 4 elemente, cele de cheie 1, 2 i index r mn neschimbate, dar se


adaug un element de cheie 3 i valoare 8.
Operatori de cast
Se folosesc pentru conversii explicite. Sintaxa general este:
(tip)

ceea ce determin conversia c tre tipul indicat ntre paranteze. PHP permite urm toarele
conversii explicite:

14

Modului 1. Concepte introductive despre PHP


(int) sau (integer) tre integer
(bool) sau (boolean)
tre boolean
(float), (double) sau (real) tre float
(string) tre string
(array) c tre array
(object) tre object
(unset) tre NULL

M1.U1.8.
Preceden a i asociativitatea operatorilor
Prin preceden n elegem ordinea de evaluare a opera iilor n cadrul unei expresii, expresie ce
nu con ine paranteze, dar are operatori de diferite tipuri.
Prin asociativitate n elegem ordinea de evaluare a opera iilor ntr-o expresie ce nu con ine
paranteze, dar are operatori de acela i tip.
Operator
Asociativitate
clone new
non-asociativ
[]
stnga-dreapta
++ -non-asociativ
~ - (tip) @
non-asociativ
instanceof
non-asociativ
!
dreapta-st nga
* / %
stnga-dreapta
+ - .
stnga-dreapta
<< >>
stnga-dreapta
< <= > >= <>
non-asociativ
== != === !==
non-asociativ
&
stnga-dreapta
^
stnga-dreapta
|
stnga-dreapta
&&
stnga-dreapta
||
stnga-dreapta
?:
stnga-dreapta
= += -= *= /= .= %= &= |= ^= <<= >>= dreapta-stnga
and
stnga-dreapta
xor
stnga-dreapta
or
stnga-dreapta
Tabelul 8: Ordinea descrescatoare a priorit ii i asociativitatea operatorilor

M1.U1.9.
Constante
Constantele sunt identificate printr-un nume i au o singur valoare. Numele este un
identificator (care nu va fi precedat de semnul $), dar exprim adresa unei zone de memorie
nemodificabil . Odat valoarea constantei stabilit , aceasta nu mai poate fi modificat . Prin
conven ie, numele constantelor se scriu cu majuscule.
Definirea unei constante se poate face utiliznd func ia define() (Exemplul 21).
Observatia 4. Definirea unei constante cu define(nume, valoare)
define("CONSTANTA", "o constanta");
echo CONSTANTA; // Afiseaza: "o constanta"

Constantele pot avea valori doar de tipul: boolean, integer, float sau string.

15

Modului 1. Concepte introductive despre PHP

Domeniul de vizibilitate al unei constante este ntregul fi ier n care a fost definit .
nlocui i zona punctat cu termenii corespunz tori.
1. In limbajul PHP variabilele sunt reprezentate prin semnul urmat de
numele variabilei.
Numele variabilei este , adica conteaza daca numele este scris cu
litere mari sau mici. Intotdeuna .. variabilelor trebuie sa inceapa cu o
. sau o liniuta de subliniere (_) si poate fi urmat de litere sau cifre.
2. este o operatie care inlocuieste o valoare cu o alta. Pe de alta
parte, egalitatea este o relatie intre doua valori. Cand doua valori sunt
., acestea raman pentru totdeauna. Totusi, puteti .. o valoare
unei variabile si ulterior puteti atribui aceleiasi variabile o alta.. . Cu
alte cuvinte, egalitatea este. ; atribuirea nu este.
3. Pentru a va ajuta sa efectuati calcule si prelucrari ale datelor, PHP
include o diversitate de . si functii utile. Cand combinati valorile
literale si variabilele cu . si functii, construiti ceea ce este cunoscut
sub numele de ..
Operatorii sunt . specifice care realizeaza o actiune specifica in
cadrul unei expresii.
.. actioneaza asupra variabilelor prezente in expresie.

M1.U1.1.
Test de evaluare a cuno tin elor
Marca i varianta corect .
1.Care sintaxa de mai jos reprezinta o sintaxa e delimitator PHP?:
a) <% %>
c) <? ?>
b) <?php?>

d) <script language="php"> </script>

2.Cum adaugati o unitate(1) variabilei $count:


a) incr count;
b) $count++;

c) $count =+1
d) incr $count;

3. Cand se defineste un identificator in PHP trebuie tinut cont de faptul ca:


a) Identificatorii sunt case sensitive.
c) Ambele de mai sus
Asadar $result este diferit de $ result
b) Identificatorii pot fi de orice lungime.
d) Nici unul de mai sus
4. Care operator este folosit pentru a concatena doua stringuri in PHP?
a) Operatorul plus (+)
b) Operatorul punct(.)
5. Care tipuri de date sunt tratate ca siruri?
a) Integer
c) String

16

Modului 1. Concepte introductive despre PHP


b) Float
6. In PHP datele string sunt:
a) delimitate prin apostrof
b) delimitate prin ghilimele
7. Operatorul % este folosit in PHP pentru:
a) modulo
b) procent
8. Care este output-ul codului de mai jos:
<?php
$tata="mama";
$mama="fiu";
echo $$tata;
?>
a) fiu
b) mama
9. Parintele PHP este?
a) Larry Wall
b) Rasmus Lerdorf
10. Care este output-ul codului de mai jos:
<? php
$str="3ron";
$a=20;
$a+=$str;
print($a);
?>
a) 320ron
b) 203ron

d) Boolean
c) Delimitate prin identificatorul <<<
d) Toate de mai sus
c) operatia bitwise
d) diviziune.

c) mamafiu
d) error
c) James Gosling
d) Guido Van Rossum

c) 23ron
d) 23

n acest capitol am creat primul script PHP. Am nv at cum s folosim un editor de


text ca s scriem, s nc rc m i s rul m un document PHP. Am examinat cteva
moduri de a ncepe i sfr i blocuri de cod PHP. Am nv at cum s folosim func ia
echo pentru a afi a date n browser, i cum s scriem cod HTML i PHP n acela i
script. Am nv at cum s ad ug m comentarii n codul PHP.
Apoi am eviden iat cteva din caracteristicile limbajului PHP. Am discutat despre
variabile, declararea i ini ializarea lor, despre variabile dinamice, precum i despre
variabile referin i valoare.
Am discutat apoi despre tipuri de date n PHP, despre c iva din cei mai importan i
operatori i posibilitatea de a i combina pentru a ob ine expresii. Discu ia despre
operatori s-a incheiat cu eviden ierea priorit ii i asociativit ii acestora. n final,
am supus aten iei modul n care s definim i s acces m constantele.

17

Modului 1. Concepte introductive despre PHP

Unitatea de nv are M1.U2. Structuri de control. Functii PHP


Cuprins:
M1.U2.1.
Introducere ........................................................................................................1
M1.U2.2.
Obiectivele unit ii de nv are ..........................................................................1
M1.U2.3.
Instruc iuni de decizie........................................................................................2
Instruc iunea if .................................................................................................................2
Instruc iunea switch ........................................................................................................3
Instruc iunea break ..........................................................................................................4
Instruc iunea continue....................................................................................................4
M1.U2.4.
Instruc iuni repetitive ........................................................................................5
Instruc iunea while ..........................................................................................................5
Instruc iunea do-while....................................................................................................5
Instruc iunea for ...............................................................................................................6
Instruc iunea foreach ......................................................................................................8
M1.U2.5.
Ce este o func ie? ..............................................................................................9
M1.U2.6.
Apelul unei func ii.............................................................................................9
M1.U2.7.
Definirea unei func ii....................................................................................... 10
M1.U2.8.
Variabile globale ............................................................................................. 14
M1.U2.9.
Func ii cu nume dinamic ................................................................................. 15
M1.U2.10. Test de evaluare a cuno tin elor .......................................................................16
M1.U2.1. Introducere
Toate scripturile prezentate n exemplele de pn acum executau instruc iunile n
mod secven ial ncepnd cu prima i terminnd cu ultima, n cazul n care datele
erau corecte. Aceasta formeaz structura secven ial . Exist , ns , multe alte
situa ii n care anumite secven e de instruc iuni nu se execut sau se execut
repetat de un num r oarecare de ori. Mai avem i cazuri n care anumite secven e
de instruc iuni se execut incomplet. Asupra tuturor acestora ne vom opri n acest
capitol.
Vom defini un bloc ca fiind o secven de instruc iuni scrise ntre
acolade. Majoritatea exemplelor din acest manual vor ine cont de aceast
observa ie. n PHP blocurile pot fi delimitate i cu ajutorul marcajului : (dou
puncte), dar acest caz va fi tratat explicit ori de cte ori va fi ntlnit.
Observatia 1.

M1.U2.2. Obiectivele unit ii de nv are


Aceast unitate de nv are i propune ca obiectiv principal o prezentare a
structurilor de control si a functiilor din PHP. La sfr itul acestei unit i de
nv are studen ii vor fi capabili s recunoasca si sa utilizeze urmatoarele:
Instruc iunea de decizie: if
Instruc iunea de decizie multipl : switch
Instruc iuni de salt: break i continue
Instruc iuni repetitive: cu test ini ial while, cu test final do-while

Modului 1. Concepte introductive despre PHP


Instruc iunea repetitiv complex : for
Instruc iunea repetitiv pentru array-uri: foreach
Defini ia func iilor i necesitatea folosirii acestora
Apelul func iilor
Definirea func iilor, argumentele unei func ii, rezultatul unei func ii
Variabile globale
Func ii cu nume dinamic

Durata medie de parcurgere a unit ii de nv are este de 4 ore.

M1.U2.3. Instruc iuni de decizie


Instruc iunile de decizie fac ca pe baza unor condi ii, exprimate prin expresii logice, anumite
secven e de cod s fie executate iar altele nu.
Instruc iunea if
Sintaxa general a instruc iunii este:
if(expresie){
//cod care se execut dac
}
else{
//cod care se execut altfel
}

expresie este adevarat

Modul de execu ie este urm torul: mai nti, instruc iunea if evalueaz expresie, ce este
scris ntre paranteze. Dac aceasta are valoarea TRUE, se execut blocul de cod imediat
urm tor. Altfel, se va executa blocul de cod urm tor lui else. Este posibil ca else nu existe
i atunci, n cazul n care valoarea expresie este FALSE, se va trece la urm toarea instruc iune
din secven a curent de program, f a se mai executa ceva din if.
Exemplul 1. Instructiunea if - else
<html>
<head>
<title>
Exemplul 1
</title>
</head>
<body>
<?php
$stare= "trist";
if ( $stare == "vesel" ){
echo "Uraaa, sunt vesel!";
}
else{
echo "Nu sunt vesel, ci $stare";
}
?>
</body>
</html>

Modului 1. Concepte introductive despre PHP

Folosim operatorul de comparatie == (dublu egal) pentru a compara con inutul variabilei
$stare cu textul vesel. Dac se potrivesc, atunci textul: Uraaa, sunt vesel! va fi afi at
n browser. Dac schimb m valoarea variabilei $stare="trist" i rul m scriptul, atunci
primul bloc de cod va fi s rit i se va executa cel de-al doilea, cel din clauza else, iar textul
Nu sunt vesel, ci trist va ap rea scris n browser.
Observatia 2. n cazul n care pe ramura else a unui if este imediat un nou if, iar
marcajul de bloc este format din perechi de dou puncte, atunci trebuie inut cont de regula
potrivit c reia elseif trebuie s fie un singur cuvnt (token). Dac marcajul de bloc este
dat de o pereche de acolade, atunci aceast regul este op ional .

Instruc iunea switch


Este cunoscut i sub numele de instruc iunea de selec ie multipl . Este posibil ca dintr-o
succesiune de secven e de cod doar o parte dintre ele s se execute pentru anumite date de
intrare. Orice instruc iune switch poate fi scris echivalent prin mai multe instruc iuni if, dar
switch ofer o sintax mai compact , mai clar i mai flexibil .
Sintaxa general este:
switch(expresie){
case rezultat1:
// cod care se execut dac expresie are valoarea
// rezultat1
break;
case rezultat2:
// cod care se execut dac expresia are valoarea
// rezultat2
break;
.
.
.
default:
// cod care se execut dac expresia nu a avut nici una
// dintre valorile enumerate mai sus
}

unde:
expresie poate fi orice expresie ce returneaz o valoare integer, float, boolean sau

string;
rezultat1, rezultat2 reprezint expresii de oricare dintre tipurile anun ate
anterior, dar compatibile cu expresie, i nu neap rat de valori distincte;
case este cuvnt rezervat PHP, ce precede fiecare dintre selec iile instruc iunii. Mai
multe case-uri pot fi urmate de o singur secven de cod, dar trebuie desp ite de
caracterul : (dou puncte);
default este cuvnt rezervat PHP, ce indic o secven ce urmeaz a fi executat
atunci cnd niciunul dintre case-urile anterioare nu a fost selectat. default este

op ional;
break este cuvnt rezervat PHP i reprezint
sec iunea dedicat acestei instruc iuni).

instruc iunea de ntrerupere (vezi

Modului 1. Concepte introductive despre PHP

Modul de execu ie al instruc iunii este urm torul: se evalueaz expresie, i se execut
secven a de cod corespunz toare primului case care are valoarea egal , dar i secven ele
urm toare, corespunz toare celorlalte case-uri, pn la primul break ntlnit sau pn la
sfr itul instruc iunii. Dac nici o valoare corespunz toare vreunui case nu este egal cu
valoarea expresie i default exist , atunci se execut secven a de cod corespunz toare lui
default.
Exemplul 2. Instruc iunea switch

presupunem c avem o valoare reprezentnd o categorie de dimensiune. Dac


aceasta este l, atunci dorim s afi m mesajul mic, pentru 2 dorim s afi m
mediu iar pentru 3 dorim s afi m mare. Orice alt valoare vrem s produc
mesajul nepotrivit.
$numar=2;
switch($numar){
case(1):
echo "mic ";
break;
case(2):
echo "mediu ";
break;
case(3):
echo "mare ";
break;
default:
echo "nepotrivit";
}

n contextul dat mai sus n browser se va afi a mediu. Dac n Exemplul 2 instruc iunea break
ar lipsi i am p stra valorea variabilei $numar, atunci n browser s-ar afi a mediu mare
nepotrivit.
ncheiem acest paragraf cu dou instruc iuni frecvent utilizate n secven ele neliniare, numite
i instruc iuni de salt.
Instruc iunea break
Este folosit pentru ntreruperea execu iei instruc iunilor for, foreach, while, do-while sau
switch.

Sintaxa general este:


break numar;

unde, numar este op ional, dar n cazul n care este prezent va indica num rul de instruc iuni
ncuibate, dintre cele amintite, care vor fi ntrerupte de break.
Instruc iunea continue
Este folosit pentru salt la urm toarea repeti ie, dac aceasta mai exist , ntr-o instruc iune
repetitiv .

Modului 1. Concepte introductive despre PHP

M1.U2.4. Instruc iuni repetitive


Instruc iunile repetitive fac ca pe baza unor condi ii, exprimate prin expresii logice, anumite
secven e de cod s fie executate de mai multe ori.
Instruc iunea while
Este cunoscut ca instruc iunea repetitiv cu test ini ial i are urm toarea sintax general :
while(expresie){
// cod care se execut
}

ct timp expresie este adev rat

Modul de execu ie este urm torul: se evalueaz expresie. Att timp ct aceasta are valoarea
TRUE se execut blocul de cod. n interiorul acestui bloc se efectuez , de obicei, schimb ri
care influen eaz evaluarea expresiei; altfel, ciclul poate continua la infinit.
Exemplul 3. Instructiunea while
<html>
<head>
<title>
Exemplul 3
</title>
</head>
<body>
<?php
$indicator = 1;
while ( $indicator <= 12 ){
echo "$indicator * 2 = ".($indicator*2)."<br>";
$indicator++;
}
?>
</body>
</html>

n Exemplul 3 ini ializ m cu valoarea 1 variabila $indicator. Instruc iunea while testeaz , mai
nti, dac valoarea variabilei este mai mic sau egal cu 12. Dac este adev rat, atunci se
execut blocul de cod prin care se afi eaz un mesaj i se incrementeaz valoarea variabilei
$indicator. Incrementarea valorii variabilei $indicator este foarte important pentru c ea
este implicat n condi ia ce testeaz abandonarea ciclului. Blocul de cod se va executa att
timp ct condi ia este ndeplinit , adic valoarea variabilei $indicator este mai mic sau
egal cu 12.
Instruc iunea do-while
Este cunoscut sub numele de instruc iune repetitiv cu test final. Principala deosebire fa de
instruc iunea repetitiv cu test ini ial este c blocul de cod din corpul instruc iunii se execut
car o dat . Sintaxa general este:
do{
// cod care se execut
}
while(expresie);

ct timp expresie este TRUE

Modul de execu ie este urm torul: se execut blocul de cod, se evalueaz expresie i ct
timp valoarea este TRUE se execut blocul de cod.

Modului 1. Concepte introductive despre PHP


Exemplul 4. Instruc iunea do-while
<html>
<head>
<title>
Exemplul 4
</title>
</head>
<body>
<?php
$numar = 1;
do{
echo "Executia nr.: $numar<br>\n";
$numar++;
}
while ( $numar > 1 && $numar < 10 );
?>
</body>
</html>

n Exemplul 4 variabila $numar se ini ializeaz cu 1. Scriptul apoi va afi a: Executia nr.:
1, dup care valoarea variabilei $numar va fi incrementat . Instruc iunea do-while va evalua
condi ia, adic dac valoarea variabilei $numar este mai mare ca 1 i mai mic ca 10. Cum
condi ia este ndeplinit , se va reveni la execu ia blocului de cod. Procesul se continu pn
cnd valoarea variabilei $numar va fi 10. n acest moment expresia logic va avea valoarea
FALSE i execu ia ciclului va fi ntrerupt .
Instruc iunea for
Poate fi asem nat cu o instruc iune repetitiv cu test ini ial. Totu i, instruc iunea for este o
reuniune de mai multe instruc iuni. Sintaxa general este:
for(expr1; expr2; expr3){
// cod care se execut
}

ct timp valoarea expr2 e TRUE

unde:
expr1 reprezint o succesiune de instruc iuni, separate prin virgul , care se execut o
singur dat i unde, de regul , se fac ini ializ ri;
expr2 este o expresie logic care determin continuarea ciclului;
expr3 este o succesiune de instruc iuni, separate prin virgul , n care, de regul , se
execut opera ii la sfr itul fiec rei itera ii, dup terminarea blocului de cod din
interiorul instruc iunii i naintea evalu rii expr2.

Toate cele 3 expresii pot s lipseasc . Obligatorii sunt doar cele dou ; (punct i virgul ). n
cazul n care expr2 lipse te, valoarea sa este considerat tot timpul TRUE. n acest caz, ie irea
din ciclu trebuie f cut altfel, spre exemplu prin instruc iunea break. i blocul de cod poate
lipsi. n acest caz instruc iunea for trebuie urmat de ;.

Modului 1. Concepte introductive despre PHP


Exemplul 5. Instruc iunea for
<html>
<head>
<title>
Exemplul 5
</title>
</head>
<body>
<?php
for ( $i=1; $i<=12; $i++ ){
echo "$i * 2 = ".($i*2)."<br>";
}
?>
</body>
</html>

Rezultatele Exemplelor 3 i 5 sunt la fel. Se observ ns c instruc iunea for are un cod mai
compact.
Cnd compilatorul ajunge la instruc iunea for, variabila $i este ini ializat , iar apoi expresia
logic este evaluat . Dac valoarea ei este TRUE, atunci blocul de cod este executat. Apoi
valoarea variabilei $i este incrementat i expresia logic este evaluat din nou. Acest proces
continu pn cnd rezultatul expresiei logice este FALSE.
Exemplul 6. Folosirea instruc iunii break ntr-o instruc iune for
<html>
<head>
<title>Exemplul 6</title>
</head>
<body>
<?php
for ($i =10 ; $i >= 0; $i-- ){
if ( $i <= 0 )
break;
$rezultat = 4000/$i;
echo "4000 impartit la $i este...
$rezultat<br>";
}
?>
</body>
</html>

Exemplul 6 ini ializeaz variabila $i cu 10. Expresia logic verific dac valoarea variabilei $i
este mai mic sau egal cu 0. n cadrul blocului de cod num rul 4000 este mp it la $i i se
afi eaz rezultatul n browser. Variabila $i este apoi decrementat i se refac verific rile. La
ultimul pas, atunci cnd $i este 0, avem mp rtire la zero. Prin ad ugarea instruc iunii break

for m ie irea din ciclu i evit m afi area unor erori.


Observatia 3. mp irea la zero n PHP nu va cauza o eroare fatal . Totu i, va fi generat un
mesaj de avertizare, iar execu ia va continua.

Modului 1. Concepte introductive despre PHP


Instruc iunea foreach
Datorit modului special n care sunt tratate array-urile n PHP, spre exemplu au domenii de
indici discontinue, s-a introdus o instruc iune repetitiv pentru parcurgerea acestora. Sintaxa
general este:
foreach($variab_array as $cheie => $valoare){
//cod ce se execut de attea ori c te elemente sunt n variab_array
}

unde:
$variab_array numele unei variabile ce con ine un array;
as cuvnt rezervat PHP;
$cheie numele unei variabile n care se va depune valoarea cheii elementului curent,
variabil ce are domeniul de vizibilitate n interiorul instruc iunii foreach;
$valoare numele unei variabile n care se va depune valoarea elementului curent,
variabil ce are domeniul de vizibilitate n interiorul instruc iunii foreach.

Modul de lucru este urm torul: se creaz o copie a irului de parcurs, pe aceast copie se
pozi ioneaz indicatorul care parcurge irul de pe prima pozi ie, se trece valoarea cheii n
variabila $cheie i a elementului curent n variabila $valoare, se execut blocul de cod. Se
procedeaz asem tor, prin parcurgere consecutiv , a fiec rui element din ir pn la ultima
pozi ie.
Exemplul 7. : Folosirea instruc iunii foreach
<html>
<head>
<title>Exemplul 7</title>
</head>
<body>
<?php
$a=array(2,"unu"=>6,7,"indice"=>10);
foreach($a as $b => $c){
echo "elementul cu cheia: $b are valoarea
$c<br>";
}
?>
</body>
</html>

Deoarece se lucreaz cu o copie, n cazul n care se fac modific ri ale valorilor


irului, acestea nu vor fi recunoscute dect n interiorul instruc iunii foreach. n afara
acesteia valorile elementelor irului vor fi cele de dinaintea parcurgerii. Pentru ca eventualele
modific ri s fie recunoscute i n exteriorul instruc iunii se va folosi variabila referin ,
&$valoare.
Observatia 4.

Instruc iunea foreach poate fi folosit


obiect (vezi capitolul dedicat obiectelor PHP).
Observatia 5.

i la parcurgerea atributelor unui

Modului 1. Concepte introductive despre PHP


nlocui i zona punctat cu termenii corespunz tori.
1. Instructiunea conditional este folosit pentru a compare dou valori
si a realiza actiuni diferite n baza . testului. Instructiunea urmeaz
sintaxa (are forma).. Partea . testeaz o condiie. Dac
aceasta este adevrat, atunci este urmat ramura.. n caz contrar se
merge pe ramura. .
2. O structura este o secventa de cod ce permite realizarea . a
aceleiasi operatii de un anumit numar de ori. O structura este
definita de 2 elemente: operatia care este . si conditia de . a
executiei. In unele cazuri se cunoaste si numarul de ...
3. Instructiunea . este folosita atunci cand nu se cunoaste dinainte
numarul de.. . Are o forma mai intuitiva decat for si multe persoane o
considera mai usor de folosit. Diferenta dintre si for este aceea ca prima
este mai generala si mai flexibila. Se poate chiar afirma ca for este o
situatie particulara a unei structurii ..
4. O alta structura repetitiva este.. . Diferenta fata de este ca
verificarea de face la final, dupa ce se executa cel . o data secventa de
cod. O traducere in cuvintele noastre ar fi: "executa secventa si ..
conditia este.. , repet-o".
5. PHP ofera o structura repetitiva foarte puternica si des folosita:.. .
Aceasta permite .. prin toate elementele unui vector. Pot fi folositi si
vectori simpli si asociativi.
Spre deosebire de celelalte instructiuni, pentru . nu trebuie specificata
explicit o conditie de.. , fiind de datoria interpretorului PHP sa
iterarea atunci cand s-a ajuns la . vectorului.

M1.U2.5. Ce este o func ie?


Func iile reprezint modalitatea de baz de implementare a conceptului de modularizare a
programelor, n PHP. Prin modularizare programele devin mai flexibile, mai lizibile de c tre
programator i mai u or de depanat. Modularizarea st la baza conceptului de programare
orientat de obiecte despre care vom discuta n capitolele urm toare.
Iat un prim exemplu de utilizare a unei func ii: presupunem c , n cadrul unui script, dorim
execut m o anumit ac iune de mai multe ori, dar nu intr-un ciclu. Solu ia eficient este ca
acea ac iune s fie definit ntr-o func ie i apelat ori de cte ori avem nevoie.
O func ie este, a adar, un bloc de cod care poate fi apelat de c tre programele apelante.
Func ia poate primi valori din programul apelant, execut blocul de instruc iuni i apoi,
eventual, returneaz rezultatele.
PHP ofer mai multe modalit i de lucru cu func ii i anume: func ii definite de c tre limbaj
(built-in, predefinite) sau func ii definite de c tre utilizator (user-defined).
M1.U2.6. Apelul unei func ii
Prin apelul unei func ii n elegem preluarea controlului execu iei programului de c tre blocul
de cod al func iei. Apelul func iei poate determina i ini ializarea argumentelor sale,
argumente ce pot avea valori disticte la fiecare apel. Ini ializarea se face prin lista parametrilor
actuali ai func iei.
9

Modului 1. Concepte introductive despre PHP

Sintaxa general de apel a unei func ii este:


nume_functie(lista_parametri_actuali);

unde:
nume_functie reprezint

un identificator, ce trebuie precizat anterior apelului, la


definirea func iei (indiferent c este func ie predefinit sau definit de utilizator) sau
declararea func iei (cazul func iilor autoapelate). Conform conven iei de nume PHP
identificatorul va fi scris cu litere mici, iar cuvintele vor fi separate cu liniu a de
subliniere (underscore)
lista_parametri_actuali trebuie s coincid cu num r i pozi ie cu cei din lista de
parametri formali (cei din declara ia func iei). Cum n PHP tipul nu este impus la
declararea func iilor, tipurile nepotrivite vor genera erori doar la execu ie. Num rul
parametrilor este ns foarte important s fie egal ca num r n lista actual i n cea
formal . Inegalitatea va duce la eroare nc din faza de precompilare. Lista poate fi
format din constante, variabile sau apeluri ale altor func ii.
Observatia 6.

lista_parametri_actuali poate fi vid , dar parantezele rotunde sunt

obligatorii.
Dac func ia returneaz un rezultat atunci apelul func iei poate fi operand ntro expresie compatibil cu tipul returnat de func ie.
Observatia 7.

Exemplul 8. Apelul func iilor

PHP con ine o bibliotec vast de func ii predefinite. Exemplific m apelul a dou
dintre ele, folosite pentru lucrul cu variabile array: unset() i count().
Func ia predefinit unset() permite eliminarea unor elemente dintr-un array.
Argumentul acestei func ii indic elementul ce urmeaz a fi eliminat.
Func ia predefinit count() va returna num rul de elemente ale irului argument.
<html>
<head>
<title>Exemplul 8</title>
</head>
<body>
<?php
$a=array(2,3);
unset($a[1]);
echo count($a);
?>
</body>
</html>

n Exemplul 8 cre m variabila irul $a ce are dou elemente de valoare 2 respectiv 3. Apelul
func iei unset() determin eliminarea elementului al doilea din ir, de index 1, iar prin apelul
func iei count() func ia echo va afi a num rul de elemente din ir, adic 1.
M1.U2.7. Definirea unei func ii
n momentul n care definim o func ie i facem cunoscute numele, lista parametrilor formali i
codul surs care va prelua controlul execu iei programului n momentul apelului. Pentru a
defini o func ie folosim urm toarea sintax general :
10

Modului 1. Concepte introductive despre PHP

function nume_functie(lista_parametri_formali){
// codul func iei
}

unde:
function este cuvnt rezervat PHP i precede orice definire sau declarare de func ie;
nume_functie este un identificator, cu urm toarele remarci:
o PHP nu permite supranc rcarea numelui func iilor;
o Domeniul de vizibilitate al numelui unei func ii este global;
lista_parametri_formali reprezint o list de variabile, separate prin virgul , ce

vor primi valori n momentul apelului. Lista poate fi vid , dar parantezele rotunde sunt
obligatorii(Exemplul 9). Asupra parametrilor formali, n PHP, putem face urm toarele
aprecieri:
o Transmiterea parametrilor unei func ii se face n mod predefinit prin valoare,
adic orice modificare a valorilor parametrilor produs n interiorul func iei nu
este recunoscut dup revenirea la programul apelant. PHP permite pentru
eliminarea acestui neajuns folosirea parametrilor referin , ceea ce nseamn c
fiecare dintre parametri referin vor fi preceda i de operatorul de referen iere,
&. Apelul nu face deosebire ntre parametri referin
i parametri valoare
(Exemplul 10);
o PHP permite atribuirea predefinit a valorilor parametrilor formali. Astfel,
dac n momentul apelului omitem atribuirea unei valori pentru un parametru
ce are o valoare predefinit , atunci valoarea acestuia va fi cea din defini ia
func iei. Trebuie remarcat c parametrii cu valori predefinite trebuie
pozitiona i grupat n lista parametrilor formali, n partea final a acesteia
(Exemplul 11);
codul functiei con ine orice secven valid de instruc iuni. Printre acestea se poate
afla i instruc iunea return. Aceasta determin ntreruperea execut rii func iei,

preluarea controlului de c tre programul apelant


rezultatului func iei (Exemplul 12).

i returnearea c tre acesta a

Exemplul 9. Definirea i apelul unei func ii f


parametri
<html>
<head>
<title>Exemplul 9</title>
</head>
<body>
<?php
function helloWorld(){
echo "HELLO WORLD!";
}
helloWorld();
?>
</body>
</html>

n scriptul din Exemplul 9 definim func ia helloWorld() care nu necesit nici un argument, iar
n blocul s u de cod afi m textul HELLO WORLD!. n momentul apelului textul va fi
vizualizat n browser.

11

Modului 1. Concepte introductive despre PHP


Exemplul 10.
Func ie cu parametri valoare i parametri referin
<html>
<head>
<title>Exemplul 10</title>
</head>
<body>
<?php
$a=1;
$b=2;
function interschimb($a, $b) {
$aux=$a;
$a=$b;
$b=$aux;
}
interschimb($a,$b);
echo "a=$a, b=$b";
?>
</body>
</html>

n Exemplul 10 am definit func ia cu doi parametri interschimb(), care ar fi trebuit s


interschimbe valorile variabilelor $a i $b. Dup rularea aplicatiei se constat c valorile
acestora ramn neschimbate. Aceasta deoarece cei doi parametri sunt parametri valoare.
Pentru ca modific rile f cute n interiorul func iei s fie vizibile i n exteriorul ei va trebui s
declar m parametri referin , ca n scriptul urm tor:
<html>
<head>
<title>Exemplul 10</title>
</head>
<body>
<?php
$a=1;
$b=2;
function interschimb(&$a, &$b) {
$aux=$a;
$a=$b;
$b=$aux;
}
interschimb($a,$b);
echo "a=$a, b=$b";
?>
</body>
</html>

Se constat aceea i form a apelului func iei interschimb().

12

Modului 1. Concepte introductive despre PHP


Exemplul 11.
Func ie cu argumente cu valori implicite
<html>
<head>
<title>Exemplul 11</title>
</head>
<body>
<?php
function afiseaza($mesaj="salut"){
echo $mesaj."<br>";
}
afiseaza(); // va afisa salut
afiseaza("mesaj nou");// va afisa mesaj nou
?>
</body>
</html>

n Exemplul 11, la primul apel al func iei afiseaza() va fi considerat valoarea implicit a
parametrului i anume salut. La cel de-al doilea apel, pentru c se specific o valoare, va fi
luat n considerare aceasta.
Dac dorim ca n cazul unor argumente cu valori predefinite s nu fie luate n
considerare, la execu ia func iei, valorile predefinite, atunci vom atribui la apel valoarea
NULL acelor argumente.
Observatia 8.

Observatia 9. PHP posed o bibliotec de func ii predefinite pentru controlul argumentelor


func iilor (spre exemplu func ia func_num_args() ce returneaz num rul argumentelor
transmise func iei curente etc).
Exemplul 12.
Func ie care returneaz p tratul valorii argumentului
<html>
<head>
<title>Exemplul 12</title>
</head>
<body>
<?php
function laPatrat ($numar){
return $numar * $numar;
}
echo laPatrat (4);
?>
</body>
</html>

// va afisa valoarea 16

Dup cum se observ , n Exemplul 12, valoarea returnat de instruc iunea return este ob inut
n urma evalu rii unei expresii.
Observatia 10. PHP permite apelul unei func ii n timpul definirii sale (func ii recursive) sau
definirea unei func ii n interiorul altei func ii (Exemplul 12).

13

Modului 1. Concepte introductive despre PHP


Exemplul 13.
Func ie definit n interiorul altei func ii
<html>
<head>
<title>Exemplul 13</title>
</head>
<body>
<?php
function f1() {
function f2() {
echo "salut";
}
}
f1();//apelul lui f1 trebuie facut pentru a
//avea acces la f2
f2();
?>
</body>
</html>

M1.U2.8. Variabile globale


a dup cum am afirmat, n capitolul despre variabile, domeniul implicit de existen
(vizibilitate) al variabilelor este blocul n care au fost definite. Astfel, n cazul unei func ii, o
variabil definit n programul apelant nu este recunoscut , n mod predefinit, n defini ia
func iei. Pentru a modifica domeniul predefinit de vizibilitate al variabilelor se folose te
cuvntul rezervat PHP global (Exemplul 14) sau variabila superglobal , de tip array,
predefinit , $GLOBALS (Exemplul 15). Aceast variabil este indexat dup numele variabilelor
globale re inute ca elemente.
Exemplul 14.
Variabile globale definite prin globals
<html>
<head>
<title>Exemplul 14</title>
</head>
<body>
<?php
$a = 1;
$b = 2;
function sum(){
global $a, $b;
$b = $a + $b;
}
sum();
echo $b;
?>
</body>
</html>

Exemplul 14 va afi a mesajul 3. Prin declararea global a variabilelor $a i $b n interiorul


func iei, toate referin ele c tre ele vor referi versiunea global . Dac nu am fi folosit global,

14

Modului 1. Concepte introductive despre PHP


$a i $b nu ar fi existat (ar fi avut valoarea NULL) n interiorul func iei. Nu exist nici o limit
pentru num rul de variabile globale pe care le poate manipula o func ie.
Exemplul 15.
Variabile globale definite prin $GLOBALS
<html>
<head>
<title>Exemplul 15</title>
</head>
<body>
<?php
$a = 1;
$b = 2;
function sum(){
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}
sum();
echo $b;
?>
</body>
</html>

Observatia 11. PHP de ine mai multe variabile superglobale. Printre ele: $_SERVER, $_GET,

$_POST, $_REQUEST, $_SESSION, $COOKIE, $_ENV sau $_FILES. Discu ii despre


acestea vom avea n capitolele urm toare.
M1.U2.9. Func ii cu nume dinamic
Ca i n cazul variabilelor, avem i pentru func ii conceptul de nume dinamic. Aceasta
nseamn c dac numele unei variabile este urmat de o pereche de paranteze rotunde, atunci
PHP va c uta o func ie avnd numele egal cu valoarea variabilei i o va apela (Exemplul 5.9).
Exemplul 16.
Func ii cu nume dinamic
<html>
<head>
<title>Exemplul 16</title>
</head>
<body>
<?php
function f1(){
echo "apel func ia f1<br>";
}
$func='f1';
$func();
function f2($mesaj){
echo "apel func ia f2 cu $mesaj<br>";
}
$func='f2';
$func("salut");
?>
</body>
</html>

15

Modului 1. Concepte introductive despre PHP

ne reamintim...
Functiile sunt blocuri de cod PHP (secvente de cod) bine delimitate si identificate
printr-un nume, ce executa un set de operatii. Functiile pot fi executate de mai
multe ori in cadrul unui script prin simpla apelare a numelui lor.
Exista functii predefinite, specifice limbajului PHP (cum ar fi print) ce pot fi
folosite in orice moment, fara a fi nevoie de vreo actiune speciala; si exista functii
definite de utilizator, scrise practic de programatori. Pentru ca acestea sa poata fi
folosite este nevoie sa fie declarate (si implementate).
Foarte important de stiut este faptul ca variabilele definite in afara functiilor nu
sunt disponibile in interiorul lor. In mod similar, variabilele definite in interiorul
unei functii se pierd si NU sunt disponibile in afara acesteia.

nlocui i zona punctat cu termenii corespunz tori.


1. Functiile pot primi . ce pot fi folosite in interiorul lor pentru diverse
prelucrari. Aceste .. sunt transmise sub forma de...
Pentru ca o functie sa poata primi , aceasta trebuie sa ii declare intre .
2. Printre avantajele folosirii functiilor, se numara:
- . codului
Spre exemplu, daca este nevoie sa se aceeasi secventa de cod in mai multe
parti ale unui program sau script, pentru a nu se codul de fiecare data, se
defineste o functie care este apelata de mai multe ori.
- modularizare
Odata cu aparitia .(a subprogramelor, in general) s-a introdus si conceptul
de ..care presupune problemei ce trebuie rezolvata in probleme mai
mici. Fiecare problema mai mica reprezinta un , implementat intr-o functie
care contribuie la rezultatul final.
- mentinerea .. a codului si intelegerea mai usoara a logicii aplicatiei sau a
scriptului
Acestea sunt urmari imediate ale primelor 2 puncte. Daca scriptul este.,
impartit in bucati mai mici, in care aceleasi .. de cod nu se repeta atunci va fi
mai usor si de inteles si de modificat sau intretinut.

M1.U2.10. Test de evaluare a cuno tin elor


Marca i varianta corect .
1.Care din urmatoarele instructiuni nu-si are locul langa celelalte?
a) while
c) do-while
b) foreach

d) break

2.Care instructiune trebuie folosita daca dorim sa se execute o bucata de cod atata timp cat o
conditie este indeplinita?
a) foreach
c) do-while

16

Modului 1. Concepte introductive despre PHP


d) while

b) if-else-if

3. Ce valori ar trebui asignate valoriabilelor $a, $b si $c pemntru ca scriptul sa afiseze Hello,


world!?
<?php
$string = "Hello, World!";
$a = ?;
$b = ?;
$c = ?;
if($a) {
if($b && !$c) {
echo "Goodbye Big World!";
} else if(!$b && !$c) {
echo "Nothing here";
}
} else {
if(!$b) {
if(!$a && (!$b && $c)) {
echo "Hello, World!";
} else {
echo "Goodbye World!";
}
} else {
echo "Not quite.";
}
}
?>
a) False, True, False
c) False, True, True
b) True, True, False
d) False, False, True
4. O variabila nu isi pierde valoarea la iesirea dintr-o functie atunci cand este declarata:
a) locala
c) statica
b) Parametru unei functii
d) nici un raspuns de mai sus
5. Care din urmatoarele tipuri de date nu sunt suportat de PHP?
a) Variabile locale
c) Variabile hidden
b) Parametrii unei functii
d) Variabile globale
6. Care este output-ul urmatoarei secvente de cod:
$chirie = 250;
function cheltuielo($altceva)
{
$chirie = 250 + $altceva;
return $chirie;
}
cheltuieli(50);
echo $chirie;
a) 300
c) 200
b) 250
d) Programul nu se va compila.
7. In ce circumstanta este imposibil sa asignezi o valoare default unui parametru in timpul
17

Modului 1. Concepte introductive despre PHP


declararii unei functii?
a) cand parametrul este Boolean

c) cand functia contine un singur


parametru
d) niciodata

b) cand parametrul este declarat ca


trimis prin referinta
8. Care este cel mai bun mod de a itera prin sirul $sirulmeu, presupunand ca se doreste
modificarea fiecarui element din sir?
<?php
$ sirulmeu = array ("String-ul meu",
"Alt String",
"Salutare!");
?>
a) Folosind instructiunea for
c) Folosind instructiunea while
b) Folosind instructiunea foreach
d) Folosind instructiunea do...while
9. Ce s-ar putea folosi pentru a inlocui cel mai bine urmatoarea serie de instructiuni if?
<?php
if($a == 'a') {
ofunctie();
} else if ($a == 'b') {
altafunctie();
} else if ($a == 'c') {
executaceva();
} else {
executanimic();
}
?>
a) Instructiunea switch fara case-ul
c) Doar cu instructiunea if se poate
default
reprezenta secventa de mai sus
b) Instructiunea while
d) Instructiunea switch folosind caseul default
10. Care este output-ul codului de mai jos:
<?php
$array = '0123456789ABCDEFG';
$s = '';
for ($i = 1; $i < 50; $i++) {
$s .= $array[rand(0,strlen ($array) - 1)];
}
echo $s;
?>
a) Un string de 50 de caractere random
c) Un string de 49 de caractere random
b) Un string de 49 de caractere identice,
d) Nimic, pentru ca $array nu este un
pentru ca numarul random de generare
array.
nu a fost initializat

18

Modului 1. Concepte introductive despre PHP


n aceasta unitate am studiat structurile de control i modul n care ele sunt folosite
n scripturile PHP pentru crearea paginilor flexibile i dinamice. Astfel, am discutat
despre cum s folosim instruc iunea if i cum putem crea alternative ale acesteia cu
ajutorul clauzelor elseif i else. Am discutat despre cum s folosim instruc iunea
de selec ie multipl switch n cazul unor situa ii cu teste multiple. Am discutat
despre cicluri, n particular despre ciclul while, do-while i for i cum s
folosim instru iunea break pentru a ntrerupe execu ia ciclului. n finalul discutiei
despre structurile de control am discutat despre cum s folosim instruc iunea
foreach pentru parcurgerea variabilelor de tip array.
Apoi am discutat despre func ii, despre cum s le apel m, cum s le declar m i
cum s le definim. Am discutat despre argumentele unei func ii i legat de aceasta
despre parametri formali i parametri actuali. Am f cut distinc ia ntre parametri
valoare i parametri referin . Am dat valori implicite argumentelor i am definit
func ii n interiorul altor func ii. Am discutat, de asemenea, despre rezultatul ntors
de o func ie. n final, am adus cteva complet ri unitatii de invatare despre
variabile, ntelegnd modul n care putem modifica vizibilitatea acestora i am
discutat despre numele dinamic al func iilor.

19

Modulul 2. Formulare. Sesiuni

Modulul 2. Formulare. Sesiuni

Unitatea de nv are M2.U1. Preluarea datelor dintr-un formular


Cuprins:
M2.U1.1.
Introducere ........................................................................................................1
M2.U1.2.
Obiectivele unit ii de nv are ..........................................................................1
M2.U1.3.
Formulare HTML ..............................................................................................2
M2.U1.4.
Manipularea datelor dintr-un formular ...............................................................3
Variabila superglobal $_GET............................................................................................4
Variabila superglobala $_POST .........................................................................................5
Variabila superglobala $_REQUEST ..................................................................................5
M2.U1.5.
Validarea datelor din formular ...........................................................................6
M2.U1.6.
Cod HTML i PHP ntr-o singur pagin ...........................................................8
M2.U1.7.
Despre cookie-uri ............................................................................................12
M2.U1.8.
Management-ul cookie-urilor .......................................................................... 12
Crearea unei cookie .......................................................................................................... 12
Accesul la valorile unui cookie .........................................................................................13
tergerea unei variabile cookie ......................................................................................... 14
M2.U1.9.
Array de cookie-uri ......................................................................................... 14
M2.U1.10. Test de evaluare a cuno tin elor .......................................................................15
M2.U1.1. Introducere
n modulele precedente valorile variabilelor erau atribuite n urma evalu rii unor
expresii. Aplica iile aveau o singur pagin , iar datele proveneau doar din resursele
interne ale paginii. Nu se trimiteau i nu se recep ionau date la, respectiv de la,
resurse externe paginii curente sau aplica iei.
Aceasta nu este o situa ie tipic pentru o aplica ie internet de tip client-server, unde
comunica ia ntre diversele resurse este esen ial . n acest capitol vom analiza
situa ia transmiterii datelor ntre paginile unei aplica ii folosind formularul,
respectiv prelucrarea datelor recep ionate de la un formular HTML. n modulele
urm toare vom l rgi modalitatea de comunica ie.

M2.U1.2. Obiectivele unit ii de nv are


Aceast unitate de nv are i propune ca obiectiv principal o prezentare a
modalitatilor de preluare a datelor dintr-un formular si managementul variabilelor
cookie. La sfr itul acestei unit i de nv are studen ii vor fi capabili s
recunoasca si sa utilizeze urmatoarele:
Transmiterea datelor ntre paginile web: formulare HTML
Manipularea datelor dintr-un formular
Validarea datelor din formulare

Modulul 2. Formulare. Sesiuni


Cookie-uri, defini ie, caracteristici importante
Managementul variabilelor cookie: creare, acces, tergere

Durata medie de parcurgere a unit ii de nv are este de 4 ore.

M2.U1.3. Formulare HTML


Un formular reprezint un ansamblu de zone active alc tuit din butoane, casete de selec ie,
cmpuri de editare etc. O sesiune de lucru cu o pagin web ce con ine un formular i
interac ioneaz cu un server PHP cuprinde urm toarele etape:
clientul completeaz formularul i l expediaz server-ului PHP;
aplica ia PHP de pe server analizeaz formularul i efectueaz opera iile necesare;
server-ul trimite clientului eventual un r spuns.
Un formular este definit ntr-un bloc delimitat de etichetele:
<form method=metoda action=url >

</form>

unde:
atributul method precizeaz metoda utilizat de browser pentru expedierea datelor i
poate fi una dintre:
o get (implicit ); datele introduse n formular sunt trimise prin ad ugarea la
sfr itul adresei URL, specificat de atributul action, a unor perechi de forma
nume=valoare. ntre adresa URL i date este inserat ? (semnul ntreb rii).
ntre diferitele seturi de date este introdus caracterul &. Astfel, datele trimise
prin metoda get pot fi vizualizate de c tre cel care acceseaz pagina. Aceasta
prezint avantajul c adresa poate fi marcat ca bookmark n browser-ele
actuale, dar are dezavantajul c datele nu pot con ine caractere non-ASCII. De
asemenea, cantitatea de date care poate fi procesat prin metoda get este
limitat la aproximativ 1kB;
o post; datele introduse n formular sunt expediate separat i astfel nu pot fi
vizualizate explicit de c tre cel care acceseaz pagina. Totodat , nu exist o
limit a cantit ii de date trimise sau a tipului de caractere introduse;
atributul action specific adresa URL a scriptului PHP care prelucreaz datele
formularului. Adresa URL poate fi o adres complet , care include protocolul, numele
gazdei i calea de acces, respectiv o adres par ial , care specific doar loca ie relativ
fa de pagina curent .
Majoritatea elementelor unui formular sunt introduse prin intermediul etichetei input ce are
urm toarea sintax simplificat :
<input type=tip name=nume value=valoare>

unde:

Modulul 2. Formulare. Sesiuni


atributul type indic tipul elementului ce urmeaz a fi introdus n formular. Printre
valorile posibile sunt: text (implicit), password, checkbox, radio, submit, reset,
file, hidden, image sau button
atributul name ata eaz elementului din formular un nume. Numele poate fi unic sau
mai multe elemente pot avea acela i nume (ex. cazul familiilor de radio butoane).
Valoarea atributului este trimis server-ului prin perechea nume=valoare. Dac
atributul lipse te din sintax , i se va ata a predefinit unul de c tre sistem.
atributul value este de obicei op ional. Un element care necesit n mod obligatoriu
acest atribut este checkbox. Atunci cnd este prezent ata eaz o valoare predefinit
elementului afi at. Valoarea atributului, eventual modificat de utilizator, este trimis
server-ului prin perechea nume=valoare.
O alt

etichet

frecvent utilizat

pentru introducerea de elemente ntr-un formular este

select. Prin select introducem liste de selec ie. Sintaxa simplificat a acestei etichete este:
<select name=nume size=numar>

</select>

unde:
atributul name are aceea i semnifica ie ca n cazul lui input;
atributul size precizeaz cte elemente din list sunt vizibile la un moment dat
(valoarea implicit este 1), celelalte devenind vizibile prin ac ionarea barelor de
defilare.
Elementele din lista de selec ie sunt introduse prin eticheta option ce are urm toarea sintax
simplificat :
<option value=valoare selected> text

unde:
atributul value este op ional i valoarea sa va fi expediat server-ului. Dac lipse te
server-ul va recep iona text-ul ce urmeaz etichetei;
atributul selected nu are valori i este op ional. Dac este prezent determin
vizualizarea selectat a respectivei op iuni din list .
Alte etichete ce introduc elemente n formular vor fi explicate n momentul n care apar n
exemple viitoare.

M2.U1.4. Manipularea datelor dintr-un formular


Informa ia introdus ntr-un formular este expediat serverului web prin ac ionarea butonului
de expediere (n care type="submit"), prin ac ionarea tastei enter, acolo unde formularul
permite acest lucru, sau prin oricare alte tehnici definite de programator. Destina ia de pe
server a aplica iei ce prelucreaz datele este dat de valoarea atributului action al etichetei
form.

Datele sunt transmise serverului ca o serie de perechi de form nume-valoare.


PHP include mai multe modalit i de a accesa datele introduse de utilizator ntr-un formular
dependent i de metoda cu care au fost expediate aplica iei de pe server.

Modulul 2. Formulare. Sesiuni

Variabila superglobal $_GET


Aceasta reprezint o variabil de tip array care con ine valorile elementelor transmise de la
formular scriptului PHP, ce le prelucreaz , prin metoda GET. Cheia unui element din variabil
este numele unui element al formularului iar valoarea este valoarea acelui element, transmise
prin perechea nume=valoare.
Exemplul 1. Formular n care informa iile sunt expediate prin metoda get
<html>
<head>
<title> Exemplul 1</title>
</head>
<body>
<form action="prelucrare.php" method="get">
Numele: <input type="text" name="nume"/><br>
Prenumele: <input type="text" name="prenume"/><br>
Localitatea: <input type="text" name="localitate"/><br>
Judetul: <input type="text" name="judet"/><br>
Universitatea absolvita: <br>
<select name="universitate" size="3">
<option>Universitatea din Bucuresti
<option selected>Universitatea din Brasov
<option>Universitatea din Cluj
<option>Universitatea din Iasi
</select><br>
<input type="submit" name="exped" value="Expediaza"/>
</form>
</body>
</html>

Vizualizarea acestui fi ier, con innd exclusiv cod HTML, va fi f cut n browser-ul
clientului. Clientul va completa cmpurile, va selecta Universitatea absolvita (n mod
predefinit este selectat Universitatea din Brasov) i va trimite formularul server-ului
prin ac ionarea butonului Expediaza. Trimiterea formularului se va face prin metoda get.
Fi ierul de pe server care va prelucra datele formularului este prelucrare.php (Exemplul 2).
Observatia 1. Numele fisierului de pe server constituie calea relativ a acestuia. Prin
nespecificarea niciunei alte informa ii, cele dou fi iere (cel n care se g se te formularul i
cel n care se fac prelucr rile) sunt n acela i director.
Exemplul 2. Recep ionarea informa iilor transmise dintr-un formular prin variabila
superglobal $_GET
<html>
<head>
<title> Exemplul 2 </title>
</head>
<body>
<?php
echo "Numele tau este: " . $_GET["nume"] . "<br/>";
echo "Prenumele tau este: " . $_GET["prenume"] .
"<br/>";
echo "Esti din: " . $_GET["localitate"] . "<br/>";
echo "Judetul: " . $_GET["judet"] . "<br/>";
echo "<br/>";
echo "Ai absolvit: " . $_GET["universitate"];
?>

Modulul 2. Formulare. Sesiuni


</body>
</html>

Acest fi ier va afi a n browser-ul clientului r spunsul prelucr rii (practic o succesiune de
instruc iuni echo). Browser-ul clientului va avea n zona de specificare a adreselor urm torul
URL:
http://localhost/carte/exemplul81/prelucrare.php?nume=Vasilescu&prenume=Vas
ile&localitate=Brasov&judet=Brasov&universitate=Universitatea+din+Brasov&ex
ped=Expediaza

Se observ perechile nume-valoare ce caracterizeaz fiecare element al formularului.


PHP posed variabila superglobal $_SERVER, variabil de tip array, ce
furnizeaz informa ii de mediu de pe server. Nu este obligatoriu ca toate informa iile posibil a
fi expediate s poat fi ntr-adev r disponibile. Printre informa iile trimise exist un element
cu cheia QUERY_STRING care are ca valoare ceea ce urmeaz semnului ? n adresa URL.
Aceasta poate fi o alternativ
pentru $_GET. n cazul Exemplului 2
$_SERVER['QUERY_STRING'] are valoarea:
Observatia 2.

nume=Vasilescu&prenume=Vasile&localitate=Brasov&judet=Brasov&universitate=U
niversitatea+din+Brasov&exped=Expediaza

Valoarea elementului $_SERVER['REQUEST_METHOD'] va indica tipul de


metod cu care au fost trimise server-ului informa iile din formular.
Observatia 3.

Variabila superglobala $_POST


Aceasta reprezint o variabil de tip array care con ine valorile transmise scriptului PHP prin
metoda POST, de la un formular. Cheia unui element al variabilei este numele unui element al
formularului, iar valoarea este valoarea corespunt toare respectivului element, transmise prin
perechea nume=valoare.

Exemplul 3. Exemplul 1 se modific prin schimbarea valorii atributului


method="post", iar n Exemplul 2 variabila array va schimba numele din $_GET
n $_POST. Adresa URL n acest caz este:
http://localhost/carte/exemplul81/prelucrare.php

Variabila superglobala $_REQUEST


Aceasta reprezint o variabil de tip array care con ine valori transmise scriptului PHP prin
metodele POST sau GET de la un formular. Cheia unui element al variabilei este numele unui
element al formularului iar valoarea este valoarea corespunzatoare respectivului element,
transmise prin perechea nume=valoare.
Exemplul 4. Putem p stra oricare dintre fi ierele ce con in formulare din Exemplul 1
sau Exemplul 3. n fi ierul prelucrare.php vom modifica numele variabilei
superglobale din $_GET sau $_POST n $_REQUEST.

Modulul 2. Formulare. Sesiuni


M2.U1.5. Validarea datelor din formular
Cnd lucr m cu pagini care implic procesarea formularelor este deseori necesar sa valid m
datele introduse de utilizatori. PHP con ine numeroase func ii predefinite pentru aceasta.
Facem o trecere n revist a celor mai des folosite:
is_string(var), determin dac var este de tip string. Returneaz TRUE sau FALSE;
is_int(var) sau is_integer(var), determin dac var este de tip integer.
Returneaz TRUE sau FALSE;
is_numeric(var) determin dac var este de tip numeric. Returneaz TRUE sau
FALSE;
is_double(var) sau is_float(var), determin dac var este de tip float.
Returneaz TRUE sau FALSE;
is_bool(var), determin dac var este de tip boolean. Returneaz TRUE sau FALSE;
empty(var), determin dac var este vid . Returneaz TRUE sau FALSE. Se consider
vid o variabil care are valoarea NULL, string-ul vid, string-ul nul sau valoarea 0;
isset(var), determin dac var este definit i are valoare !NULL. Returneaz TRUE
sau FALSE;
print_r(var)sau var_dump(var), afi eaz informa ii despre var;
strlen(string), returneaz lungimea string-ului (num rul de caractere).

Exemplul 5. Validarea datelor dintr-un formular

Consider m un formular n care utilizatorul introduce numele, numele de


utilizator i parola. Mai mult, impunem ca numele sa fie nenumeric i nevid,
numele de utilizator nevid iar parola nevid i de minim 6 caractere.
Acest tip de validare a formularului este foarte des intlnit , n felul acesta ne
asigur m c doar informa iile valide ntr-un format adecvat vor fi prelucrate.
<html>
<head>
<title> Exemplul 5</title>
</head>
<body>
<form method="post" action="validare.php"/>
Introduceti numele:<br>
<input type="text" name="nume"/><br>
Introduceti numele de utilizator:<br>
<input type="text" name="numeu"/><br>
Introduceti parola (trebuie sa contina minim 6
caractere):<br>
<input type="password" name="pass"/><br>
<input type="submit" name="trimite"
value="Expediaza"/>
</form>
</body>
</html>

Modulul 2. Formulare. Sesiuni


Exemplul 6. Fi ierul de validare (validare.php)

Cnd butonul Expediaza este ap sat, o serie de instruc iuni if vor fi folosite
pentru a valida con inutul cmpurilor din formular.
<html>
<head>
<title> Exemplul 6 </title>
</head>
<body>
<?php
$valid = true;
//Determina daca numele a nevid si nenumeric
if (!isset($_POST['nume'])or empty($_POST['nume'])
or is_numeric($_POST['nume'])){
$valid = false;
echo "introduceti numele<br>";
}
else{
$name = $_POST['nume'];
}
//Determina daca numele de utilizator e nevid
if
(!isset($_POST['numeu'])or(empty($_POST['numeu']))){
$valid = false;
echo "introduceti numele utilizator<br>";
}
else{
$username = $_POST['numeu'];
}
//Determina daca parola e nevida si are minim 6
caractere
if (!isset($_POST['pass'])or(empty($_POST['pass']))
or(strlen($_POST['pass'])<6)){
$valid = false;
echo "introduceti o parola corecta";
}
else{
$password = $_POST['pass'];
}
//se afiseaza mesaj de avertizare daca formularul nu
a fost
//completat corect sau datele introduse, altfel
if($valid){
echo "ati introdus:<br>";
echo "numele: $name<br>";
echo "numele utilizator: $username<br>";
echo "si o parola valida";
}
?>
</body>
</html>

Modulul 2. Formulare. Sesiuni


M2.U1.6. Cod HTML i PHP ntr-o singur pagin
n exemplele din acest capitol am folosit dou fi iere separate la fiecare aplica ie. Unul n care
erau scrise datele ce urmau a fi completate, ca parte a formularului, iar altul n care aceste date
erau prelucrate. Scenariul acesta simplu este mai rar ntilnit. n cazul valid rii unui formular
(Exemplul 5 i Exemplul 6) este posibil ca un formular sa fie afi at de mai multe ori pn cnd
utilizatorul s l completeze cu date valide. Dac am folosi metoda de pn acum ar trebui s
folosim butonul Back din browser pentru a reveni la formular. Folosirea acestui buton, mai
ales n cazul complet rii formularelor, nu este indicat . Mai mult, nici facil nu este. Ar trebui
re inem erorile, apoi s incerc m sa le identific m n formular i n final le corect m.
Solu ia flexibil este s nc rc m aceea i pagin pn cnd utilizatorul reu te s completeze
date valide. n plus, erorile pe care le produce s fie afi ate n preajma cmpului ce le-a
generat. Dup ce ntregul formular a fost valid completat trecem la pagina de prelucrare a
datelor.
Pentru a implementa aceast solu ie va trebui s intercal m cod HTML i cod PHP. Din punct
de vedere strict al arhitecturii softului aceasta nu este cea mai bun solu ie. Dar, pentru c este
un important pas nainte din punct de vedere al functionalit ii avem solu ii i pentru
mbun irea arhitecturii soft-ului (ex. folosirea template framework-ului SMARTY).
Exemplul 7. Cod HTML i PHP ntr-o singur pagin
Fisierul ex.php
<?php
$gata=true;
if(isset($_POST['nume'])){
if(empty($_POST['nume']) or
is_numeric($_POST['nume']))
$gata=false;
}
else
$gata=false;
if(isset($_POST['numeu']))
if(empty($_POST['numeu']))
$gata=false;
if(isset($_POST['pass']))
if(empty($_POST['pass']) or
(strlen($_POST['pass'])<6))
$gata=false;
if(!$gata)
include "formular.php";
else
include "prelucrare.php";
?>
Fi ierul formular.php
<html>
<head>
<title> Exemplul 7</title>
</head>
<body>
<form method="post" action="ex.php"/>
Introduceti numele:<br>
<input type="text" name="nume" value=

Modulul 2. Formulare. Sesiuni


<?php
if(isset($_POST['nume']))
print $_POST['nume'];
?>
>
<?php
if(isset($_POST['nume']))
if(empty($_POST['nume']) or
is_numeric($_POST['nume']))
print "<font
color='RED'>introduceti numele</font>";
?><br>
Introduceti numele de utilizator:<br>
<input type="text" name="numeu" value=
<?php
if(isset($_POST['numeu']))
print $_POST['numeu'];
?>
>
<?php
if(isset($_POST['numeu']))
if(empty($_POST['numeu']))
print "<font
color='RED'>introduceti numele utilizator</font>";
?><br>
Introduceti parola (trebuie sa contina minim 6
caractere):<br>
<input type="password" name="pass" value=
<?php
if(isset($_POST['pass']))
print $_POST['pass'];
?>
>
<?php
if(isset($_POST['pass']))
if(empty($_POST['pass']) or
(strlen($_POST['pass'])<6))
print "<font
color='RED'>introduceti o parola corecta</font>" ;
?><br>
<input type="submit" name="trimite"
value="Expediaza"/>
</form>
</body>
</html>
Fi ierul prelucrare.php
<html>
<head>
<title> Exemplul 7 </title>
</head>
<body>
<?php
echo "ati introdus:<br>";
$nume=$_POST['nume'];
echo "numele: $nume <br>";
$numeu=$_POST['numeu'];

Modulul 2. Formulare. Sesiuni


echo "numele utilizator: $numeu <br>";
echo "si o parola valida";
?>
</body>
</html>

Aplica ia este organizat n 3 fi iere. Aceasta este doar o chestiune de organizare. F


nicio
problem puteam scrie un singur fi ier i ob ineam acelea i rezultate. Din punct de vedere
organiza ional am preferat aceast mp ire pentru a oferi o anumit flexibilitate aplica iei i
pentru a scoate n eviden anumite neajunsuri, care vor fi rezolvate n capitolele urm toare.
Fi ierul ex.php este fi ierul de baz . n el se alege ce pagin va fi nc rcat n browser. Dac
datele de intrare sunt inconsistente sau suntem la prima rulare, se ncarc fi ierul
formular.php. Aceast ac iune se repet pn cnd datele devin consistente (respect
condi iile impuse). Altfel, se ncarc fi ierul prelucrare.php. Decizia de nc rcare revine
fi ierului ex.php.
n fi ierul formular.php, care con ine un formular clasic, introducem datele de intrare.
Deosebirea fa de Exemplul 5 const n faptul c valoarea atributului value al fiec rui tag
input este stabilit dinamic. Astfel, ini ial aceasta este vid , apoi va p stra valoarea anterioar
pentru ca utilizatorul s o observe i s o corecteze, dac este cazul. De asemenea, dac
valoarea introdus pentru un anumit cmp este gre it , n dreptul cmpului respectiv va apare
un mesaj de eroare, scris cu ro u, la renc rcarea paginii formularului. Am ales ca metod de
transmitere POST pentru c este transmis o parol , care trebuie sa fie secret . Exist i alte
mijloace de secretizare, dar aceasta este acum cea mai la ndemn .
n fi ierul prelucrare.php facem prelucr rile dup ce datele au fost validate. Acestea ar
putea consta n commit pe o baz de date, upload de fi iere samd. Noi am afi at doar datele
introduse de utilizator.
Un inconvenient major al situa iei prezentate este acela c test rile, f cute o
dat n formular.php, trebuie ref cute n ex.php, pentru a decide asupra fi ierului ce
urmeaz a fi nc rcat n browser. Aceasta deoarece nu avem posibilitatea de a transmite datele
ntre pagini dect prin intermediul formularului. Singura solu ie, acum, ar fi fost un element
hidden, dar acesta are o valoare static . Pe alte solu ii de rezolvare, posibile, le vom studia
n capitolele urm toare.
Observatia 4.

n Exemplul 7 am folosit func ia predefinit include(nume). Aceasta


permite inserare de cod PHP n alt cod PHP, deja existent. Parametrul nume al func iei
reprezint numele fi ierului (incluznd eventual calea: absolut sau relativ ) n care este
stocat codul ce urmeaz a fi inserat. include() p streaz domeniul global al variabilelor
din fi ierul gazd . n cazul n care fi ierul parametru nu este g sit se va emite un mesaj de
avertizare, dar execu ia aplica iei va continua. Fi ierele incluse pot returna valori la fel ca i
func iile. Ca i n cazul func iilor, apelul instructiunii return ncheie execu ia codului
fi ierului inclus i returneaz o valoare (Exemplul 8).
Observatia 5.

Exemplul 8. Fi ier inclus ce returneaz o valoare


Fi ierul ex.php
<html>
<head>

10

Modulul 2. Formulare. Sesiuni

</head>
<body>
<?php
$addResult = include("pagina2.php");
print "fisierul inclus returneaza $addResult";
?>
</body>
</html>
Fi ierul pagina2.php
<?php
$retval = ( 4 + 4 );
return $retval;
//daca ar exista cod, n continuare, acesta nu ar fi
executat
?>
Cele dou fi iere se afl n acela i director. n fi ierul ex.php calea fi ierului
pagina2.php este precizat relativ.

Un comportament asem tor cu include() are func ia require() care va determina, ns ,


ntreruperea execu iei aplica iei n caz de eroare.
Observatia 6. Valid ri se pot face n mai multe moduri. Cea aleas de noi, prin PHP, are
avantajul de a comunica cu server-ul de aplica ie i mai departe cu server-ul de baze de date
pentru valid ri complexe, dar prezint dezavantajul c n cazul valid rilor simple (ex. un
cmp este numeric) se pierde prea mult timp. O posibilitate de validare este i cu JavaScript.
Aceste valid ri se fac local, la client, dac clientul permite acest lucru.

nlocui i zona punctat cu termenii corespunz tori.


1. . sunt elementele prin intermediul carora utilizatorii trimit date
catre. . Pe o pagina web pot fi introduse diferite tipul de informatii
(parole, comentarii, mesaje, etc). Toate aceste date sunt transmise catre
.. prin intermediul ("form").
2. Un form trebuie sa aiba specificate obligatoriu 2 atribute: "" si
" ". . reprezinta locatia unde vor fi transmise datele, reprezentata
prin numele fisierul ce va prelucra requestul (de regula un fisier PHP).
Acest atribut poate fi.. , specificand ca datele vor fi transmise catre
acelasi script ce afiseaza formularul (fisierul curent).Al doilea atribut este
. Ce specifica metoda de acces.
3. . este cea mai uzuala metoda, folosita implicit de browsere pentru a
trimite .. catre servere. Majoritatea paginilor pe care le vizualizam pe
internet sunt obtinute in urma unei cereri . De exemplu, scrierea unui
URL in bara de adrese a browserului sau accesarea unui link, sau a unei
imagini, toate sunt request-uri de tip .
4. este opus metodei. , este folosita pentru a transmite informatii
catre server (in engleza "post data"). Spre deosebire de care permite
doar o cantitate limitata de date sa fie transmisa de la client (browser) la
serverul web, . dispune de limite mai generoase, fiind standardul de

11

Modulul 2. Formulare. Sesiuni


transmitere a datelor. Astfel, upload-ul unui fisier pe server, salvarea unui
post pe blog, etc - toate sunt requesturi de tip .

M2.U1.7. Despre cookie-uri


n toate exemplele de pn acum valoarea variabilelor disp rea atunci cnd scriptul PHP, care
le con inea, i ncheia execu ia. O solu ie de p strare a valorilor pe timp ndelungat este
folosirea cookie-urilor.
Un cookie reprezint un text, de lungime relativ mic , identificat printr-un nume i stocat pe
calculatorul client de c tre browser-ul web. Un cookie const din una sau mai multe perechi
de tip nume-valoare.
Cookie-urile sunt transmise de c tre server-ul web browser-ului ca un HTTP header.
Browserul stocheaz cookie-urile n unitatea de disc local a clientului i retransmite aceste
valori de fiecare dat cnd sunt accesate de server. n general, cookie-urile sunt disponibile
doar site-urilor care le-au creat. Exist i cazuri exceptate, cum ar fi cross-site cooking, care
permit accesul la acelea i cookie-uri mai multor site-uri.
Cookie-urile sunt utile, spre exemplu, pentru a stoca identitatea utilizatorului sau preferin ele
de vizualizare ale acestuia. Cnd utilizatorul revine la site-ul web, variabilele cookie permit
browser-ului s recunoasc utilizatorul i s restaureze op iunile site-ului, selectate de c tre
utilizator.
Dezavantajele folosirii cookie-urilor constau din:
un utilizator poate dezactiva variabilele cookie prin stabilirea unei op iuni a browserului i atunci folosirea lor devine imposibil ;
n anumite situa ii, variabilele cookie pot fi vizualizate i de un alt utilizator dect cel
care le-a stocat;
un site poate stoca numai 20 de variabile cookie i numai 4KB de informa ii n
unitatea de disc local a utilizatorului.
n ciuda acestor dezavantaje, variabilele cookie r mn cea mai popular tehnic pentru
stocarea de valori pe termen lung.
M2.U1.8. Management-ul cookie-urilor
Crearea unei cookie
Pentru a crea (adic a trimite c tre calculatorul client) o variabil cookie apel m func ia
setcookie(), care are urm toarea sintax simplificat :
setcookie(nume, valoare, expirare, cale);

unde:
nume specific numele variabilei cookie i este un identificator. Este singurul
parametru obligatoriu;
valoare specific valoarea variabilei. Este parte a perechii nume-valoare re inut pe
calculatorul client;
expirare specific momentul expir rii variabilei cookie (exprimat n secunde trecute
de la 1 ianuarie 1970, ora 0.00.00, GMT). Dup aceast or variabila cookie nu mai

12

Modulul 2. Formulare. Sesiuni


este accesibil . n general, este convenabil s se specifice momentul expir rii folosind
func ia predefinit time(), care returneaz data i ora curent , exprimate n secunde
scurse de la 1 ianuarie 1970, la care s ad ug m o valoare care s specifice num rul de
secunde ct variabila cookie va fi accesibil . De remarcat este faprul c variabila
cookie este stocat pe calculatorul client, deci timpii implica i sunt lua i de pe acesta,
nu de pe server-ul pe care se afl aplica ia. Implicit acest parametru are valoarea 0,
ceea ce nseamn pn la nchiderea browser-ului;
cale specific domeniul de valabilitate al cookie-ului. Astfel, dac valoarea
parametrului este /, atunci cookie-ul este disponibil ntregului domeniu, dac
valoarea este /director/, atunci valabilitatea este directorul specificat i toate
subdirectoarele sale. Implicit are valoarea directorului curent.
Pentru c valorile cookie se trimit prin HTTP header trebuie ca apelul lui
setcookie() se fac nainte de orice alt r spuns trimis c tre browser-ul client. Ele sunt
ntotdeauna printre primele linii de cod dintr-un script.
Observatia 7.

Observatia 8. Pe lng apelul func iei time() PHP mai pune la dispozi ie i o func ie de
creare a datelor, exprimate n secunde. Sintaxa simplificat a acesteia este:
mktime(ore, minute, secunde, luna, zi, an);

n caz de dat invalid ntoarce -1.


Accesul la valorile unui cookie
PHP de ine variabila superglobal $_COOKIE, ce reprezint o variabil de tip array n care
cheia unui element este numele cookie-ului, iar valoarea acestuia reprezint valoarea cookieului.
De asemenea, putem accesa valoarea unui cookie prin variabila superglobal $_REQUEST, la
fel ca n cazul informa iilor trimise din formulare.
Pentru a accesa valoarea unui cookie trebuie ca acesta sa fie depus pe discul
clientului. A adar o aplica ie care creaz un cookie i l i acceseaz va avea disponibil
valoarea acestuia abia la a doua rulare (Exemplul 9).
Observatia 9.

13

Modulul 2. Formulare. Sesiuni


Exemplul 9. Crearea i afi area unei variabile cookie
<?php
setcookie( "fruct", "mar", time()+3600);
?>
<html>
<head>
<title> Exemplul 7.1</title>
</head>
<body>
<?php
if ( isset( $_COOKIE['fruct'] ) )
print "<p>Ati ales fructul
".$_COOKIE['fruct']."</p>";
else
print "<p>Salut! Aceasta este prima ta vizita!
</p>";
?>
</body>
</html>

Se creeaz o variabil cookie fruct cu valoarea


r. Durata de via a este
stabilit folosind func ia time() pentru a afla data curent , la care ad ug m 3600
(o or ).
tergerea unei variabile cookie
Se realizeaz tot prin apelul func iei setcookie() care va fixa un timp de valabilitate al
variabilei mai mic dect timpul curent.
setcookie( "fruct", "", time()-60);

Astfel, la urm toarea accesare a aplica iei variabila cookie fruct nu va mai fi valabil .
M2.U1.9. Array de cookie-uri
Sub acela i nume putem avea un ir de cookie-uri. Pentru aceasta vom crea un array, n care
cheia fiec rui element reprezint numele fiec rui cookie, iar valoarea elementului este
valoarea cookie-ului. (Exemplul 10)
Exemplul 10.
Array de cookie-uri
<?php
setcookie("cookie[unu]", "unu");
setcookie("cookie[doi]", "doi");
setcookie("cookie[trei]", "trei");
if (isset($_COOKIE['cookie'])) {
foreach ($_COOKIE['cookie'] as $nume => $val) {
echo "$nume : $val <br />\n";
}
}
?>

n Exemplul 10 putem observa modul de construc ie al numelui unui element ntr-un array de
cookie-uri. Avem ntai numele variabilei array, n cazul nostru cookie, i apoi cheia scris
ntre paranteze drepte, f apostrofuri.
.

14

Modulul 2. Formulare. Sesiuni

ne reamintim...
Cookies reprezinta portiuni de informatii (stocate sub forma de fisiere de mici
dimensiuni) ce se afla pe calculatorul utilizatorului si care sunt create si folosite de
catre browser in comunicarea cu serverul web. De obicei cookie-urile sunt folosite
pentru a identifica utilizatorii sau a pastra urma vizitelor pe un site.
Cookie-urile pot fi sterse cu usurinta de catre utilizator, sau pot fi blocate de catre
browser, deci folosirea lor trebuie facuta cu grija si doar in cazuri de necesitate. Un
cookie poate contine o cantitate limitata de informatie iar durata de viata poate fi
limitata (la un anumit numar de zile, la inchiderea sesiunii de lucru, etc) sau
nelimitata (pana la stergerea lor).
PHP dispune de 2 functii prin care se pot crea cookie-uri: setcookie si
setrawcookie. Cookie-urile create pe calculatorul utilizatorului pentru un site sunt
transmise de catre browser inapoi la server si sunt disponibile in variabila globala
$_COOKIE.
nlocui i zona punctat cu termenii corespunz tori.
1. Adaugarea unui cookie pe calculatorul vizitatorului se realizeaza cu ajutorul
functiei . Aceasta are urmatoarea sintaxa: ($nume, $........,
$expirare, $.....).
2. PHP de ine variabila superglobal ........., ce reprezint o variabil de tip ....... n
care cheia unui element este ..... cookie-ului, iar ......... acestuia reprezint .......
cookie-ului.
3. Deoarece o variabila are o data de.. , aceasta va fi stearsa automat la
un oarecare interval de timp dupa .. sa. Totusi, puteti sterge o variabila
cookie imediat. Pentru aceasta, fixati momentul . variabilei cookie la un
moment de timp in trecut.

M2.U1.10. Test de evaluare a cuno tin elor


Marca i varianta corect .
1.Cum sunt variabilele sesiune accesate?
a) prin intermediul $GET

c) prin intermediul variabilelor globale

b) prin intermediul $POST

d) nici unul de mai sus.

2.Care functie face ca urmatorul header sa fie adaugat la ouyput=ul serverului?


Set-Cookie: foo=bar;
a) getCookie()
b) $POST

c) setCookie
d) printCookie()

3. Cum poate scriptul index.php sa acceseze elemental form email din urmatorul form

15

Modulul 2. Formulare. Sesiuni


HTML?
<form action="index.php" method="post">
<input type="text" name="email"/>
</form>
a) $_GET['email']
c) $_SESSION['text]
b) $_POST['email']
d) $_POST['text']
4. Daca nu se seteaza in mod explicit o data de expirare a unei variabile cookie, ce se va
intampla cu ea?
a) Va expira imediat
c) Expira la sfarsitul sesiunii browser
a utilizatorului
b) Nu va expira niciodata
d) Expira numai daca scriptul nu a
creat o sesiune server-side
5. Considerand urmatorul form si script. Ce va afisa scritpul daca user-ul introduce cuvintul
php si extraordinar in 2 casute text?
<form action="index.php" method="post">
<input type="text" name="element[]">
<input type="text" name="element[]">
</form>
<?php
echo $_GET['element'];
?>
a) Nimic
c) phpextraordinar
b) Un notice
d) extraordinarphp
6. Ce se intampla cand un form este submitted intr-un script PHP ce contine doua elemente cu
acelasi nume?
a) Sunt combinate intr-un array si
c) Valoarea celui de-al doilea element
stocate intr-o variabila supergloabala
suprascrie valoarea primului intr-un
array superglobal corespunzator
d) PHP afiseaza un warning
b) Valoarea celui de-al doilea element
este adaugata la valoarea primei intru-n
array superglobal corespunzator
7. Cum ati stoca un array intr-un cookie?
a) adaugand doua paranteze ([]) la
c) nu este posibil sa stochezi un array
numele cookie-ului
intr-un cookie din cauza limitarilor de
stocare
b) folosind functia implode
d) adaugand cuvantul cheie ARRAY
la numele cookie-ului.
8. Ce se va afisa la rularea urmatorului script?
<?php
ob_start();
for ($i = 0; $i < 10; $i++) {
echo $i;
}
$output = ob_get_continut();

16

Modulul 2. Formulare. Sesiuni


ob_end_curata();
echo $ouput;
?>
a) 12345678910
c) nimic
b) 1234567890
d) un notice
9. In mod default PHP stocheaza datele sesiune in ........
a) filesystem
c) memoria virtuala
b) baza de date
d) memoria shared
10. Trebuie sa numarati parametrii trimisi in URL de o operatie POST. Modul correct este:
a) count($POST_VARS);
c)count($_POST);
b) count($POST_VARS_PARAM);

d)count($HTTP_POST_PARAM);

Pe parcursul acestei unitati de invatare am studiat cum s lucr m cu formulare, cu


variabilele superglobale $_POST, $_GET i $_REQUEST i cum s valid m
formularele. Apoi am mai f cut un pas nainte n crearea paginilor web dinamice.
Am organizat fi ierele astfel nct s permit solu ii flexibile de navigare i
validare.
n finalul unitatii de invatare am discutat principalele elemente ce caracterizeaz un
cookie, am creat cookie-uri prin apelul functiei setcookie(), am accesat valorile
cookie-urilor prin variabilele superglobale $_COOKIE i $_REQUEST, am ters
cookie-uri modificnd timpul de expirare i am creat iruri de cookie-uri.

17

Modulul 2. Formulare. Sesiuni

Modulul 2. Formulare. Sesiuni

Unitatea de nv are M2.U2. Sesiuni


Cuprins:
M2.U2.1.
Introducere ........................................................................................................1
M2.U2.2.
Obiectivele unit ii de nv are ..........................................................................1
M2.U2.3.
Ce este o sesiune?..............................................................................................1
M2.U2.4.
Pornirea unei sesiuni .........................................................................................2
M2.U2.5.
Lucrul cu variabile sesiune ................................................................................4
Distrugerea unei sesiuni ......................................................................................................5
M2.U2.6.
Test de evaluare a cuno tin elor .........................................................................7
M2.U2.1. Introducere
n general, prin sesiune ntelegem perioada de activitate a unei comunica ii ntre
entit ,i spre exemplu ntre client i server sau ntre diverse alte mijloace de
comunicare.
Pentru a putea explica no iunea de sesiune n PHP vom descrie, pe scurt, cadrul
general de lucru al aplica iilor client-server din internet.

M2.U2.2. Obiectivele unit ii de nv are


Aceast unitate de nv are i propune ca obiectiv principal lucrul cu sesiuni in
PHP. La sfr itul acestei unit i de nv are studen ii vor cunoaste urmatoarele:
Ce este o sesiune i la ce se folosesc sesiunile
Cum pornim i cum prelu m o sesiune
Cum folosim variabilele sesiune
Cum distrugem o sesiune

Durata medie de parcurgere a unit ii de nv are este de 2 ore.

M2.U2.3. Ce este o sesiune?


Principalul model ce descrie, prin implement ri ale protocoalelor de re ea, comunicarea
calculatoarelor ntr-o re ea ca internetul este TCP/IP. Acesta este organizat pe patru nivele
abstracte, fiecare nivel con innd unul sau mai multe protocoale, i anume: nivelul de leg tur
(link level), nivelul internet (internet level), nivelul de transport (transport level) i nivelul de
aplica ie (application level).

Modulul 2. Formulare. Sesiuni


n cadrul aplica iilor PHP ne intereseaz nivelul de aplica ie al modelului TCP/IP. Unul dintre
principalele protocoale la acest nivel este HTTP (HyperText Transfer Protocol). HTTP este
un standard de tip cerere-r spuns ntre un client i un server. Clientul face o cerere HTTP
folosind un web browser c tre un server care formuleaz r spunsul (server-ul web).
HTTP nu este constrns s utilizeze exclusiv modelul TCP/IP (de i este cel
mai des folosit), ci poate folosi orice model ce pune la dispozi ie un protocol de transport
compatibil.
Observatia 1.

n mod obi nuit procesul de comunicare se desf oar astfel: clientul HTTP ini iaz o cerere
(format din cererea propriu-zis , un header, o linie liber i eventual un mesaj), apoi printrun protocol de transport (cel mai des TCP - Transmission Control Protocol) se conecteaz la
un port (n mod predefinit portul 80). Server-ul, prin acel port, a teapt cererile clientului, le
recep ioneaz , transmite un mesaj de recep ionare i apoi un r spuns la cererea clientului.
HTTP este un protocol f stare (stateless). Aceasta nseamn c pe server-ul web nu se re in
informa ii despre utilizatori ntre cereri. Totu i acesta nu este neap rat un avantaj pentru c
gestionarea informa iilor despre utilizatori revine n grija programatorului. Exist mai multe
metode de rezolvare: folosind cookie-uri, sesiuni server-side sau prin parametrii adresei URL.
Sesiunile au fost integrate n PHP ncepnd cu versiunea 4 cu rolul de a stoca i urm ri datele
utilizatorilor atunci cnd ace tia navigheaz ntre mai multe pagini ale unui site. Una dintre
principalele caracteristici ale unei sesiuni, datorate protocolului HTTP, este identificatorul de
sesiune (ID).
Un identificator de sesiune este n mod obi nuit atribuit unui vizitator la prima vizit a unui
site. Identificatorul este deseori un string lung de caracteres, alese n mod aleator. n cazul
PHP-ului identificatorul de sesiune este generat de server i trimis clientului care l stocheaz
ca pe un cookie. n afar de identificatorul de sesiune, toate celelate date apar innd sesiunii
utilizatorului curent sunt stocate pe server. Dac identificatorul de sesiune nu este posibil a fi
nregistrat ca un cookie (browser-ul a blocat folosirea cookie-urile), atunci l putem transmite
codificat n adresa URL a cererii client.
M2.U2.4. Pornirea unei sesiuni
Pentru a putea folosi o sesiune trebuie mai nti ca aceasta s fie pornit . n mod predefinit
sesiunile nu pornesc automat.
Pentru a realiza pornirea automat a sesiunilor trebuie ca n fi ierul php.ini s set m
valoarea op iunii session.auto_start la valoarea 1. n mod predefinit:
session.auto_start = 0

Dac sesiunile nu pornesc automat atunci va trebui s apel m func ia session_start() n


fiecare script PHP ce folose te sesiuni. Pentru c session_start() se apeleaz att la
pornirea unei sesiuni, ct i la confirmarea faptului c respectivul script folose te o sesiune
deja pornit , atunci este obligatoriu apelul func iei nainte de orice transmitere de date (ca n
cazul cookie-urilor).
Dupa ce o sesiune a fost pornit , vom avea acces la valoarea identificatorului de sesiune
folosind func ia session_id(). Aceasta, f parametri, returneaz valoarea identificatorului
sesiunii curente (Exemplul 1).

Modulul 2. Formulare. Sesiuni

Exemplul 1. Pornirea unei sesiuni


<?php
session_start();
?>
<html>
<head>
<title>Exemplul 1</title>
</head>
<body>
<?php
print "<p>Bine ati venit, sesiunea ID este
".session_id()."</p>\n\n";
?>
</body>
</html>

n Exemplul 2 avem apelul func iei session_id() cu parametrul idnou. Acesta determin
modificarea identificatorului de sesiune returnnd valoarea nou setat . idnou este, de fapt,
string-ul ce va constitui id-ul noii sesiuni. Dac dorim ca acesta s fie identificatorul de
sesiune
pentru
ntreg
site-ul
curent
va
trebui
s -l
nregistr m
cu
setcookie(session_name(),
session_id())
(Exemplul 2). Func ia predefinit
session_name() va returna numele sesiunii curente. n mod predefinit, n PHP, numele
sesiunii este PHPSESSID.
Exemplul 2. Schimbarea i nregistrarea identificatorului de sesiune
<?php
session_id("idnou");
session_start();
setcookie(session_name(),session_id());
?>
<html>
<head>
<title>Exemplul 2</title>
</head>
<body>
<?php
print "<p>Bine ati venit, sesiunea ID este
".session_id()."</p>\n\n";
?>
<a href="pagina2.php">pagina 2</a>
</body>
</html>

n pagina2.php vom avea identificatorul de sesiune: idnou.


Acesta este modul cel mai frecvent utilizat i cel mai recomandat. Dac ns browser-ul nu
accept cookie-uri, vom putea lucra cu sesiuni, dar vom avea dezavantajul c identificatorul
de sesiune va fi parte a URL-ului, deci va fi mai u or de interceptat.
3

Modulul 2. Formulare. Sesiuni

Lucrul cu cookie-uri este n PHP i cel predefinit. Pentru ca identificatorul de sesiune s nu fie
stocat n cookie vom modifica op iunea:
session.use_cookies = 0

din fi ierul php.ini.


n URL perechea nume-valoare, ce transmite identificatorul de sesiune, va fi
descris sub forma: session_name()=session_id(), cu specificarea c n mod
obligatoriu aceasta va fi prima pereche n adresa URL, dintre perechile de date ce vor fi
expediate server-ului.
Observatia 2.

alte modific ri sesiunea r mne curent atta timp ct browser-ul este activ. Cnd
utilizatorul reporne te browser-ul, cookie-ul ce re ine valoarea identificatorului este resetat.
Putem schimba acest comportament modificnd variabila session.cookie_lifetime n
fi ierul php.ini, men ionnd i timpul dup care sesiunea va expira dup nchiderea browserului.

M2.U2.5. Lucrul cu variabile sesiune


PHP posed variabila de tip array, superglobal , $_SESSION n care cheia unui element este
numele variabilei sesiune, iar valoarea elementului este valoarea variabilei sesiune. PHP pune
la dispozi ie cte un array pentru fiecare sesiune identificat prin identificatorul sesiunii.
Exemplul 3 ilustreaz modul de lucru cu variabile sesiune, identificatorul fiind trimis prin
ambele modalit i: cookie i URL.

Exemplul 3. Utilizarea variabilelor sesiune


Fi ierul: ex.php
<?php
session_start();
echo 'Pagina #1';
$_SESSION['culoare'] = 'verde';
$_SESSION['animal']
= 'pisica';
$_SESSION['time']
= time();
if(!SID)
// Functioneaza daca session cookie-urile sunt
acceptate
echo '<br /><a href="pagina2.php">pagina 2</a>';
else
// Sau transmitem prin url
echo '<br /><a href="pagina2.php?' . SID . '">pagina
2</a>';
?>
Fi ierul: pagina2.php
<?php
// pagina2.php
session_start();

Modulul 2. Formulare. Sesiuni

echo 'Pagina #2<br />';


echo $_SESSION['culoare']."<br>"; // verde
echo $_SESSION['animal']."<br>";
// pisica
echo date('Y m d H:i:s', $_SESSION['time']);
echo '<br /><a href="ex.php">pagina 1</a>';
?>

n Exemplul 3, fi ierul ex.php, am creat 3 elemente n irul sesiunii curente. n fi ierul


pagina2.php, care are un link n fi ierul ex.php, identificatorul de sesiune se transmite prin
cookie, dac cookie-urile sunt acceptate, sau prin URL altfel.
n cel de-al doilea caz avem la dipozi ie variabila PHP predefinit SID, nevid doar n cazul n
care session.use_cookies = 0, i care re ine perechea session_name()=session_id().
Valorile transmise din ex.php vor fi recunoscute n pagina2.php, pe baza identificatorului
de sesiune comun.

Distrugerea unei sesiuni


Pentru eliberarea tuturor variabilelor ata ate unei sesiuni se folose te
session_unset(). Ca variant pentru aceast func ie putem folosi atribuirea:

func ia

$_SESSION = array();

Pentru a terge un element din variabila $_SESSION se folose te func ia unset(var) ca n


cazul tergerii oric rei variabile.
unset($_SESSION['culoare']);

Apelul anterior determin

tergerea elementului de cheie culoare din array-ul $_SESSION.

Pentru tergerea tuturor datelor din sesiunea curent se apeleaz func ia session_destroy().
Aceast func ie nu terge i identificatorul de sesiune memorat. Pentru a terge i cookie-ul
vom apela:
setcookie(session_name(), '', time()-42000, '/');

adar, pentru a distruge o sesiune, inclusiv variabilele ata ate, vom folosi urm toarea
secven :
session_start();
$_SESSION = array();
setcookie(session_name(), '', time()-42000, '/');
session_destroy();

Modulul 2. Formulare. Sesiuni


ne reamintim...
Sesiunile, reprezinta o functionalitate prin care anumite informatii sunt mentinute
de la o pagina la alta. O sesiune dureaza atat timp cat utilizatorul acceseaza un site
si se incheie odata cu inchiderea browserului.
In PHP o sesiune reprezinta perioada de timp in care mai multe scripturi PHP,
accesate la momente diferite de timp, pot stoca si folosi informatii comune. O
sesiune incepe atunci cand un script apeleaza functia session_start si se termina
atunci cand utilizatorul inchide browserul (exista si alte modalitati de a porni o
sesiune, dar nu sunt prea uzuale - folosirea comenzii session_start este metoda
recomandata).
O sesiune se intinde pe mai multe requesturi (pe parcursul a mai multor accesari ale
diferitelor pagini), iar pentru a identifica existenta unei sesiuni, PHP poate folosi
cookie-uri sau parametri GET un URL-ul paginii.

nlocui i zona punctat cu termenii corespunz tori.


1. In momentul in care un script apeleaza functia . pentru prima data
intr-o sesiune de lucru, se transmite un . catre browserul clientului.
Fiind vorba de un., este necesar ca functia . sa fie apelata
inaintea oricarei instructiuni ce afiseaza ceva (print, echo, etc) si inaintea
oricarui cod HTML. .-ul transmis contine un identificator ce poarta
numele de Session ID, pe baza caruia se poate face distinctie intre
sesiunea curenta si alte sesiuni ale altor utilizatori ce acceseaza site-ul in
acel moment.
2. Instructiunea session_start() nu este necesara daca in fisierul de
configurare "", variabila "session.auto_start" are valoarea..
3. Functia accepta un parametru. Astfel putem seta un anumit
pentru sesiunea curenta. In acest caz trebuie sa apelam functia ..
inainte de functia : session_start().
4. Pentru a putea sterge o sesiune este necesar sa incepem scriptul PHP cu
instructiunea: .. , ca intotdeauna cand folosim sesiuni.
Pentru a sterge toate variabilele memorate in matricea $_SESSION
folosim:.. ;
5. Datele sesiunii sunt memorate in server in fisiere . Pentru a sterge
datele sesiunii din server folositi:

Modulul 2. Formulare. Sesiuni


M2.U2.6. Test de evaluare a cuno tin elor
Marca i varianta corect .
1.Presupunand ca un browser client nu este restartat niciodata, dupa cat timp dupa ultimul
acces va expira o sesiune si va deveni subiect pentru garbage collection?
a) Dupa exact 1.440 secunde
c) nu va expira niciodata decat daca
este stearsa manuala
d) expira doar daca browser-ul este
b) Dupa un numar de secunde specificat
restartat.
in setarea din session.gc_maxlifetime
INI
2.Cum se porneste o sesiune?
a) session(start);
b) session();

c) session_start();
d) begin_session();

3. Care din urmatoarele se foloseste pentru a mentine o valoare a unei variabile, in cadrul mai
multor pagini?
a) static
c) session_register
b) global.
d) Nici unul de mai sus
4. Pentru a putea sterge doar o variabila memorata in sesiune folosim:
a) unset($_SESSION();
c) session_destroy(nume_variabila)
b)unset($_SESSION(nume_variabila);
d) nici un raspuns de mai sus
5. Cum se numeste variabila de tip array, superglobala, in care cheia unui element este numele
variabilei sesiune, iar valoarea elementului este valoarea variabilei sesiune?
a) $REQUEST
c) $SESSION
b) $POST
d) Nici un raspuns de mai sus.
6
n aceasta unitate de invatare am discutat despre cadrul general de folosire a
sesiunilor, am pornit i am reluat o sesiune precum i am nregistrat o sesiune nou .
Am studiat modalitatea de transmitere a identificatorului de sesiune: prin variabile
cookie sau prin URL. Am creat variabile sesiune i le-am utilizat n diferite pagini.
n final, am distrus sesiunile i am eliberat variabilele ata ate sesiunilor.

Modulul 3. Lucrul cu fisiere

Modulul 3. Lucrul cu fisiere

Unitatea de nv are M3.U1. Operatii cu fisiere. Gestionarea


fisierelor
Cuprins:
M3.U1.1.
Introducere ........................................................................................................1
M3.U1.2.
Obiectivele unit ii de nv are ..........................................................................2
M3.U1.3.
Deschiderea fi ierelor i crearea fluxurilor de lucru cu fi iere ............................2
M3.U1.4.
Opera ii elementare cu fi iere ............................................................................4
Citirea din fi ier ..................................................................................................................4
Scrierea n fi ier..................................................................................................................5
M3.U1.5.
Gestionarea lucrului cu fi iere ...........................................................................6
Copierea fi ierelor ..............................................................................................................6
tergerea fi ierelor ..............................................................................................................7
Redenumirea fi ierelor ........................................................................................................7
M3.U1.6.
Lucrul cu directoare...........................................................................................7
M3.U1.7.
Opera ii pe fi iere ..............................................................................................8
Verificarea existen ei unui fi ier .........................................................................................8
Fi ier sau Director?.............................................................................................................8
Func ii ce returneaz atributele unui fi ier ...........................................................................8
Func ii de lucru cu pointer-ul unui fi ier .............................................................................8
M3.U1.8.
Colectarea datelor dintr-un formular ..................................................................9
M3.U1.9.
nc rcarea fi ierelor .........................................................................................10
M3.U1.10. Test de evaluare a cuno tin elor .......................................................................14
M3.U1.1. Introducere
PHP, ca orice alt limbaj modern de programare, ofera facilitati avansate in lucrul
cu fisierele. Astfel, folosind cod PHP se pot crea, modifica, manipula si sterge
fisiere.
Fisierele sunt colectii de informatii stocate pe un dispozitiv de stocare (hard-disk,
CD, etc). In functie de formatul datelor continute fisierele se impart in doua
categorii: fisiere text si fisiere binare.
- Fisierele text sunt cele care contin text simplu ce poate fi citit, reprezentat
si modificat de catre oricine si de catre orice secventa de cod. Desi codul
sursa PHP are o anumita structura si poate fi interpretat intr-un anumit
mod, el este la baza un fisier text, ce poate fi citit. De asemenea continutul
sau poate fi modificat oricand/.
- Fisierele binare sunt acele fisiere ce contin secvente de text intr-un anumit
format si cu o structura specifica inteleasa doar de un calculator (de o
anumita secventa de cod). Un exemplu de fisier binar este o imagine (fisier
cu extensia .jpg) sau o melodie (fisier cu extensia .mp3). Fisierele binare
sunt utile pentru ca pot contine orice tip de date, cu orice structura se
doreste.
PHP ofera suport pentru ambele tipuri de fisiere: text si binare. Atat timp cat se
1

Modulul 3. Lucrul cu fisiere


cunoaste structura fisierelor binare (ce tipuri de informatii contin) acestea pot fi
modificate din PHP. Cu toate acestea, in cele ce urmeaza ne vom concentra asupra
fisierelor text intrucat sunt cel mai des intalnite si mai usor de folosit.

M3.U1.2. Obiectivele unit ii de nv are


Aceast unitate de nv are i propune ca obiectiv principal lucrul cu sesiuni in
PHP. La sfr itul acestei unit i de nv are studen ii vor cunoaste urmatoarele:
Crearea fluxurilor pentru lucrul cu fi iere externe
Opera ii elementare cu fi iere: citirea, scriere i ad ugarea
Gestionarea lucrului cu fi iere: copierea, redenumirea, tergerea
Opera ii cu pointerul de flux ata at fi ierului
Aplica ie: stocarea datelor din formular
nc rcarea fi ierelor pe server.

Durata medie de parcurgere a unit ii de nv are este de 2 ore.

M3.U1.3. Deschiderea fi ierelor i crearea fluxurilor de lucru cu fi iere


Deschiderea unui fi ier sau a unui URL se face prin func ia fopen(), ce are urm toarea
sintax simplificat :
fopen(nume_fi ier, mod)

Aceast func ie returneaz un flux prin deschiderea unei resurse dat de nume_fi ier.
Sintaxa complet pentru nume_fi ier este de forma: protocol://..., unde protocol
poate fi: file (implicit), http (numai pentru citire) sau ftp (att pentru citire ct i pentru
scriere, dac server-ul suport conexiuni ftp). Este posibil ca protocol s lipseasc i atunci
PHP decide c nume_fi ier este adresa unui fi ier local. n acest caz adresa poate fi una
absolut sau una relativ (construit fa de directorul curent). Pentru ca fi ierul s se poat
deschide trebuie ca PHP s aib drepturi asupra acelui fi ier. Modul n care un fi ier este
deschis este dat de string-ul mod (Tabelul 1) al func iei.
Mod

Descriere

Deschide un fi ier existent pentru citire. Pointerul este plasat la nceputul


fi ierului.

r+

Deschide un fi ier pentru citire sau scriere. Pointerul este plasat la nceputul
fi ierului

Deschide un fi ier pentru scriere. Dac fi ierul nu exist , atunci este creat.

Modulul 3. Lucrul cu fisiere


Altfel, pointerul este plasat la nceputul fi ierului i con inutul existent este ters.

w+

Deschide un fi ier pentru scriere sau citire. Daca fi ierul nu exist , atunci este
creat. Altfel, pointerul este plasat la nceputul fi ierului i con inutul existent
este ters.

Deschide un fi ier pentru scriere. Dac fi ierul nu exist , atunci este creat.
Altfel, pointerul este plasat la sfr itul fi ierului.

a+

Deschide un fi ier pentru scriere sau citire. Dac fi ierul nu exist , atunci este
creat. Altfel, pointerul este plasat la sfr itul fi ierului.
Tabelul 1: Descrierea modurilor de deschidere a unor fi iere

Ca i n alte limbaje de programare (ex: C) i n PHP, pe lng precizarea


modului de deschidere a fi ierului, este indicat a se preciza tipul fi ierului deschis. PHP
interpreteaz orice fi ier extern ca fiind de unul dintre tipurile: binar sau text. Nu exist o
regul privind tipul predefinit, acesta depinznd de versiunea de PHP utilizat . Diferen a ntre
tipuri const doar n interpretarea sfr itului de linie. Dac fi ierul binar interpreteaz sfr itul
de linie ca pe un singur caracter, fi ierul text l interpreteaz ca pe dou caractere (<CR> i
<LF>). Aceast interpretare are consecin e importante n deschiderea fi ierelor. Pentru a
preciza tipul de fi ier vom ad uga la sfr itul string-ului mod unul dintre caracterele b sau t.
Func ia fopen() returneaz fluxul n caz de succes i FALSE altfel. Dac deschiderea cu
succes a fi ierului nu a avut loc din cauza unei c i invalide, permisiuni de securitate
nerespectate sau alte motive, se va genera un mesaj de eroare. Pentru a suprima mesajul de
eroare predefinit putem folosi operatorul @ i una dintre urm toarele func ii predefinite PHP
care s trateze aceste erori:
exit(mesaj) care ncheie execu ia scriptului curent i afi eaz mesajul de eroare
Observatia 1.

mesaj
die(mesaj) care este un alias al func iei exit().

Pentru nchiderea fluxului c tre un fi ier se folose te func ia fclose() ce are sintaxa:
fclose(flux);

Func ia necesit ca parametru fluxul care a fost creat la deschidere. Returneaz TRUE n caz de
succes i FALSE altfel.
Este recomandat ca nchiderea fluxului s se fac n mod explicit, dar este obligatoriu acest
lucru atunci cnd fluxul a fost deschis pentru scriere (Exemplul 1), pentru a ne asigura de
nchiderea memoriei tampon i transferul tuturor datelor n fi ierul extern.
Exemplul 1. Crearea unui fi ier extern
<?php
$numefisier = "../fi ier.txt";
$flux=@fopen($numefisier,"wt") or exit("Nu se poate
deschide fi ierul");
fclose($flux);
?>

Modulul 3. Lucrul cu fisiere

n Exemplul 1 primul pas este s cre m o variabil , $numefisier, care s re in calea


fi ierului care va fi deschis pentru scriere. Calea este relativ . Interpretarea prefixului ../ este
aceea c fi ierul nou creat se afl n directorul r cin directorului fi ierului curent. Dup
logica cre rii aplica iilor, de care am discutat n Capitolul 2, avem mai nti directorul ce
con ine workspace-ul, apoi directorul proiectului, director ce con ine i fi ierul curent al
aplica iei. A adar, am creat fi ier.txt n directorul workspace-ului. Simpla deschidere
pentru scriere a fi ierului, deschiderea fluxului i apoi nchiderea sa determin crearea unui
fi ier vid, cu numele indicat.
M3.U1.4. Opera ii elementare cu fi iere
Citirea din fi ier
Dup opera ia de deschidere cu succes a unui flux urmeaz opera iile n cadrul acestuia. Una
dintre ele este citirea. PHP ofer mai multe func ii de citire. n acest paragraf vom aminti
cteva dintre acestea.
fread(flux, lungime) care determin citirea binar dintr-un flux existent.
Parametrii func iei sunt: numele fluxului, flux, i num rul de octe i dori i a fi citi i
din flux, lungime. Citirea se termin cnd:
s-a atins num rul de octe i indicat;
s-a ntlnit EOF (end of file sfr itul fi ierului);
s-au citit 8192 de octe i;
pachetul devine indisponibil din cauza problemelor de re ea.
Func ia returneaz un string sau FALSE n caz de eroare.
Exemplul 2. Citirea din fi ier cu fread()
<?php
$numefisier = "fi ier.txt";
$flux = @fopen($numefisier, "r") or exit("fisierul
nu poate fi deschis");
$continut = @fread($flux,filesize($numefisier)) or
exit("fisierul nu poate fi citit");
echo $continut."<br>";
fclose($flux);
?>

Pentru determinarea dimensiunii fi ierului citit am folosit func ia filesize()


ce are ca parametru numele extern al acestuia. Se observ c i pentru aceast
func ie am folosit operatorul @.

Modulul 3. Lucrul cu fisiere


file_get_contents(nume_fi ier) care determin citirea ntr-un string a
ntregului con inut al unui fi ier. Aten ie, parametrul este numele extern al
fi ierului!
stream_get_contents(flux) asem
tor cu precedenta, dar parametrul este
fluxul creat la deschidere:
Exemplul 3. Citirea din fi ier cu stream_get_contents()
$numefisier = "http://cs.unitbv.ro/";
$flux = @fopen($numefisier, "rb") or exit("fisierul
nu poate fi deschis");
$continut = @stream_get_contents($flux) or
exit("fisierul nu poate fi citit");

Se observ c

i pentru aceast func ie am folosit operatorul @.

fgetcsv(flux, lungime, delimitator) func ie folosit


pentru citirea
con inutului unei linii din flux, pornind de la pointerul curent al fluxului i
transformarea (parsarea) datelor citite, n func ie de delimitator, ntr-o variabil
de tip array. Paremetrul delimitator este format dintr-un singur caracter, n mod
predefinit , (virgula). Parametrul lungime este op ional ncepnd cu PHP5 i
poate fi setat la 0.
Exemplul 4. Citirea din fi ier cu fgetcsv()
Edit m fi ierul fi ier.txt din Exemplul 2 astfel nct s con in
urm toarea linie: 50,17,34,90, p str m neschimbat deschiderea

fluxului i apoi ad ug m liniile de cod:


$continut = @fgetcsv($flux) or exit("fisierul nu poate
fi citit");
for ($i=0; $i < sizeof($continut); $i++){
echo $continut[$i];
echo "<br/>";
}

Se observ c pentru aceast


implici i.

func ie am folosit operatorul @ i parametrii

Scrierea n fi ier
Pentru scrierea ntr-un flux deschis pentru creare sau ad ugare PHP pune la dipozi ie mai
multe func ii. Vom da o descriere a celor mai importante dintre ele:
fwrite(flux, string, lungime) func ie care determin scrierea con inutului
parametrului string n flux-ul creat pentru aceasta. lungime este un parametru
op ional care indic cnd se va termina scrierea, dup ce a fost atins num rul de
caractere specificat sau s-a atins sfr itul stringului (Exemplul 5). Func ia returneaz
num rul de octe i scri i, n caz de succes, sau FALSE, altfel.
Exemplul 5. Scrierea n fi ier cu fwrite()
<?php
$numefisier = "fi ier.txt";

Modulul 3. Lucrul cu fisiere


$flux = fopen($numefisier, "w") or
exit("fisierul nu poate fi deschis");
$continut = "text scris n fisier";
fwrite($flux,$continut);
fclose($flux);
?>

Dac exist deja fi ier.txt, con inutul s u va fi ters i se va crea un fi ier nou;
file_put_contents(nume_fiser, date) func ie folosit pentru scrierea ntr-un
fi ier. Primul parametru este numele extern al fi ierului iar al doilea este numele
unei variabile din care se va face scrierea. Acest parametru poate fi string, array
sau un flux deja creat. Returneaz lungimea irului scris, n caz de succes, sau
FALSE, altfel;
stream_copy_to_stream(flux_sursa,
flux_destinatie)
func ie
asem toare ca func ionalitate cu cea anterioar , doar c parametrii sunt fluxuri
create pentru citire, flux_sursa, respectiv scriere, flux_destinatie. Returneaz
num rul de octe i transfera i;
fputcsv(flux, date, delimitator) func ie ce scrie ntr-un flux deja creat o
linie format din elementele parametrului date de tip array i delimitate de
delimitator. Implicit delimitatorul este virgul . Returneaz lungimea irului
scris, n caz de succes, sau FALSE, altfel.
M3.U1.5. Gestionarea lucrului cu fi iere
Copierea fi ierelor
Pentru a copia con inutul unui fi ier extern ntr-un alt fi ier extern PHP pune la dispozi ie
func ia copy(). Sintaxa acesteia este :
copy(nume_fiser_sursa, nume_fiser_destinatie)

Cei doi parametri reprezint numele externe ale fi ierelor. Func ia returneaz TRUE, n caz de
succes, sau FALSE, altfel. Ca n cazul oric ror scrieri, dac destina ie exist , con inutul s u va
fi ters i nlocuit cu cel al fi ierului surs (Exemplul 6).

Exemplul 6. Copierea fi ierelor cu copy()


<?php
$numefisiersursa = "fi ier.txt";
$numefisierdestinatie = "fisiernou.txt";
$status = @copy($numefisiersursa, $numefisierdestinatie) or
die("copierea nu se poate face");
echo "copiere facuta cu succes";
?>

Modulul 3. Lucrul cu fisiere


tergerea fi ierelor
PHP ofer func ia unlink() pentru tergerea fi ierelor externe. Func ia trebuie folosit cu
grij pentru c , o dat ce un fi ier a fost ters el nu mai poate fi recuperat. Sintaxa func iei este
urm toarea:
unlink(nume_fiser)

Func ia returneaz TRUE, n caz de succes, sau FALSE, altfel (Exemplul 7).
Exemplul 7. tergerea unui fi ier cu unlink()
<?php
$numefisier = "fisier.txt";
$status = @unlink($numefisier) or exit("fisierul nu poate
fi sters");
echo "stergere facuta cu succes";
?>

Redenumirea fi ierelor
Func ia rename() este folosit pentru redenumirea fi ierelor. Sintaxa func iei este :
rename(nume_fi ier_original, nume_fi ier_nou)

Func ia redenume te fi ierul referit de primul parametru, nume_fi ier_original, cu numele


dat de cel de-al doilea parametru, nume_fi ier_nou. Ambele sunt nume externe de fi iere.
Func ia returneaz TRUE, n caz de succes, sau FALSE, altfel (Exemplul 8).
Exemplul 8. Redenumirea unui fi ier cu rename()
<?php
$numefiser = "fisier.txt";
$numenou = "fisiernou.txt";
$status = rename($numefisier, $numenou) or exit("fisierul
nu poate fi redenumit");
echo "redenumire cu succes";
?>

M3.U1.6. Lucrul cu directoare


Crearea unui director se face cu func ia:
mkdir(nume_director)

unde, nume_director poate include i calea c tre director. Func ia returneaz TRUE, n caz de
succes, sau FALSE, altfel.
tergerea unui director se face cu func ia:
rmdir(nume_director)

unde, nume_director poate include i calea c tre director. Func ia returneaz TRUE, n caz de
succes, sau FALSE, altfel.

Modulul 3. Lucrul cu fisiere


M3.U1.7. Opera ii pe fi iere
Verificarea existen ei unui fi ier
Putem testa existen a unui fi ier sau a unui director folosind func ia file_exists(). Sintaxa
acesteia este:
file_exists(nume)

unde, nume poate include i calea c tre fi ier sau director. Func ia returneaz TRUE, n cazul n
care fi ierul sau directorul exist , sau FALSE, altfel.
if( file_exists("test.txt") )
print "fi ierul exista!";

Fi ier sau Director?


Putem afla dac entitatea pe care o test m este fi ier folosind func ia is_file(nume).
if( is_file( "test.txt" ) )
print "test.txt este fi ier!";

De asemenea, putem verifica dac entitatea este director cu ajutorul func iei is_dir(nume).
if ( is_dir( "/tmp" ) )
print "/tmp este director";

Func ii ce returneaz atributele unui fi ier


PHP posed mai multe functii pentru testarea diferitelor atribute ale unui fi ier. Vom prezenta
n continuare cteva dintre cele mai des folosite:
filesize(nume_fi ier) determin dimensiunea n octe i a unui fi ier;
fileatime(nume_fi ier) determin timpul la care a fost accesat ultima oar fi ierul;
filemtime(nume_fi ier) determin timpul la care a fost modificat ultima oar
fi ierul;
is_readable(nume_fi ier) determin dac fi ierul poate fi citit;
is_writeable(nume_fi ier) determin dac fi ierul poate fi scris;
is_executable(nume_fi ier) determin dac fi ierul este executabil.
Func ii de lucru cu pointer-ul unui fi ier
Pn n acest moment, n fluxul deschis, nu am f cut nicio modificare a indicatorului de fi ier
(pointerul de fi ier). PHP de ine mai multe func ii ce opereaz asupra acestuia. Vom da n
continuare cteva dintre cele mai folosite:
rewind(flux) care determin pozi ionarea pointerului la nceputul fluxului de fi ier;
ftell(flux) care determin pozi ionarea curent a pointerului fi ierului;
fseek(flux, deplasare, pozitie_initiala) care determin
pozi ionarea
pointerului de fi ier cu un num r de octe i dat de deplasare (poate fi i negativ) fa
de valoarea indicat de pozitie_initiala. Valorile posibile ale celui de-al treilea
parametru sunt: SEEK_SET (implicit) nceputul fi ierului, SEEK_CUR pozi ia curent
respectiv SEEK_END sfr itul fi ierului;
feof(flux) determin dac pointerul indic sfr itul de fi ier

Modulul 3. Lucrul cu fisiere


M3.U1.8. Colectarea datelor dintr-un formular
Continu m exemplele n care un formular era prelucrat ntr-o aplica ie PHP, prin realizarea
persisten ei datelor. Cazul cel mai frecvent este salvarea ntr-o baz de date, dar deocamdat
vom realiza persisten a ntr-un fi ier extern (Exemplul 9).
Exemplul 9. Date dintr-un formular salvate ntr-un fi ier

Vom considera un formular (fi ierul ex.php) cu dou cmpuri de completat:


numele i prenumele.
Fi ierul ex.php
<html>
<head>
<title>Exemplul 9</title>
</head>
<body>
<p>continutul unei forme salvat intr-un fi ier</p>
<form method="post" action="pagina2.php">
Introduceti numele: <input type="text"
name="FName"/><br/><br/>
Introduceti prenumele <input type="text"
name="LName"/> <br/> <br/>
<input type="hidden" name="DateTime" value="<?php
echo date('g:i a') ?>"/>
<input type="submit" name="SubmitB"
value="Expediaza"/>
</form>
</body>
</html>
Fi ierul pagina2.php
<?php
if ($_POST['SubmitB'] == "Expediaza"){
$numefisier = "fi ier.txt";
$flux = fopen($numefisier, "a+");
$continut= $_POST['FName'] . "," . $_POST['LName'] .
"," . $_POST['DateTime'] ."\n";
fwrite($flux,$continut);
fclose($flux);
echo "datele din forma au fost cu succes salvate
<br>";
echo "<a href='ex.php'> o noua inregistrare
</a><br>";
echo "<a href='exit.php'>iesire</a>";
}
?>
Fi ierul exit.php
<?php
exit();
?>

Modulul 3. Lucrul cu fisiere


Cmpul hidden din ex.php con ine timpul la care formularul a fost creat, ob inut prin apelul
func iei date().
Fluxul din pagina2.php a fost creat pentru ad ugare, iar leg turile din josul paginii permit o
nou introducere sau p sirea aplica iei.
M3.U1.9. nc rcarea fi ierelor
n cadrul aplica iilor web dinamice este uneori nevoie s permitem utilizatorilor s ncarce
fi iere de pe calculatoarele personale pe serverul Web. Vom analiza problema nc rc rii de
fi iere pe un server web prin prisma interfe ei pe care trebuie s o aib clientul pentru
nc rcare i a opera iilor pe care acesta le poate face dup ce a nc rcat fi ierul pe server.
Cea mai simpl interfa
(Exemplul 10).

de realizat n browser-ul clientului este formularul predefinit HTML

Exemplul 10.
Formular HTML pentru nc rcarea fi ierelor
<form enctype="multipart/form-data" action="upload.php"
method="post">
Selecteaza fisierul: <input type="file"
name="uploadFile"><br>
<input name="SubmitB" type="submit" value="Incarca">
</form>

Metoda folosit pentru expedierea formularului, n acest caz, este obligatoriu POST i
atributul enctype, care specific metoda de criptare, trebuie s fie obligatoriu setat la
valoarea multipart/form-data. Atributul enctype este folosit n cazul unui formular pentru
a specifica modalitatea de codificare a datelor ce vor fi transmise server-ului. n mod
predefinit valoarea acestuia este application/x-www-form-urlencoded, care, ns , nu
este potrivit pentru transmiterea cantit ilor mari de date binare sau date text non-ASCII.
Unul dintre tag-urile input, din Exemplul 10, are atributul type setat la valoarea file. Acesta
va introduce n pagina web un cmp de text needitabil i un buton etichetat Browse. Butonul
permite deschiderea unei ferestre de selectare (File Upload) a fi ierului ce urmeaz a fi
nc rcat pe server. Dup ac ionarea butonului Open din aceast fereastr , numele fi ierului i
calea complet vor fi introduse n zona de text needitabil. Ac ionarea butonului Incarca, din
pagin va ncheia ac iunea elementar de copiere a fi ierului pe server.
n mod predefinit fi ierul este nc rcat n locul stabilit de directiva upload_tmp_dir din
php.ini, n principiu ntr-un director temporar.
Dup ce fi ierul a fost nc rcat, n loca ia stabilit de pe server, apel m la o aplica ie PHP care
-l gestioneze. n PHP exist variabila superglobal de tip array, $_FILES, care con ine toate
informa iile disponibile despre fi ierul nc rcat din formularul HTML.
n urma nc rc rii fi ierului din Exemplul 10, informa iile se g sesc n array-ul ata at
elementului $_FILES['uploadFile'], cheie a elementului ce a fost stabilit de atributul
name al tag-ului input ce are type="file". Elementele acestui array au urm toarea
semnifica ie:

10

Modulul 3. Lucrul cu fisiere


$_FILES['uploadFile']['tmp_name'] a c rui valoare reprezint directorul de pe
server-ul web unde fi ierele sunt stocate temporar. n mod predefinit acesta este
directorul tmp din configura ia XAMPP;
$_FILES['UploadFile']['name'] a c rui valoare reprezint numele original al
fi ierului, a a cum era pe calculatorul clientului;
$_FILES['UploadFile']['size'] a c rui valoare reprezint dimensiunea fi ierului
n octe i;
$_FILES['UploadFile']['type'] a c rui valoare reprezint
tipul MIME al
fi ierului. Chiar dac browser-ul ofer aceast informa ie ea nu este n mod obligatoriu
cert .
$_FILES['UploadFile']['error'] a c rui valoare reprezint eroarea produs n
timpul nc rc rii fi ierului. Valorile posibile sunt:
o UPLOAD_ERR_OK sau 0 reprezint nc rcare cu success;
o UPLOAD_ERR_INI_SIZE sau 1, fi ierul dep
te dimensiunea maxim
pentru nc rcare, dimensiune stabilit de directiva upload_max_filesize din
php.ini, care are valoarea predefinit 64 MB;
o UPLOAD_ERR_FORM_SIZE sau 2, fi ierul dep
te dimensiunea maxim
pentru nc rcare stabilit prin valoarea cmpului hidden din formular, denumit
MAX_FILE_SIZE, astfel:
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />

Nu este obligatoriu s
stabilim explicit aceast
dimensiune.
o UPLOAD_ERR_PARTIAL sau 3, nc rcarea par ial
a
fi ierului;
o UPLOAD_ERR_NO_FILE sau 4, nici un fi ier nc rcat.
Fi ierele nc rcate pe server n loca ia temporar vor fi terse automat dup expirarea cererii,
dac nu au fost redenumite sau mutate.
Func ia oferit de PHP pentru mutarea unui fi ier nc rcat pe server este:
move_uploaded_file(nume_fi ier_sursa, nume_fi ier_destinatie)

unde cele dou nume reprezint numele extern al fi ierelor. Dac fi ierul destina ie exist
deja, acesta va fi ters. n caz de insucces returneaz FALSE.
Exemplul 11.
Mutarea unui fi ier nc rcat pe server prin
move_uploaded_file()
Fisierul upload.php
<?php
if ($_POST[SubmitB] == "Incarca"){
move_uploaded_file($_FILES['uploadFile']
['tmp_name'], $_FILES['uploadFile']['name']);
echo "Fisierul a fost incarcat.";
}
?>

11

Modulul 3. Lucrul cu fisiere


Exemplul 11 este continuarea Exemplului 10 con innd prelucr ri ale fi ierului dup nc rcare. n
mod concret am mutat fi ierul din loca ia temporar n directorul proiectului, fi ierul nc rcat
fiind redenumit cu numele original de pe calculatorul clientului.

O alt func ie frecvent utilizat n gestionarea fi ierelor nc rcate pe server este:


is_uploaded_file(nume_fi ier)

care determin dac un fi ier a fost cu succes nc rcat pe server dintr-un formular. Returneaz
TRUE n caz de succes i FALSE, altfel. nume_fi ier este numele temporar al fi ierului de pe
server, ob inut prin $_FILES['uploadFile']['tmp_name'].
Observatia 2. PHP permite i nc rcarea mai multor fi iere de pe calculatorul client pe server,
din acela i formular. Metoda optim este de a crea a un array de cmpuri de selectare
(Exemplul 12).
Exemplul 12.
<html>

nc rcarea simultan a mai multor fi iere

<head>
<title>Exemplul 12</title>
</head>
<body>
<form action="upload.php" method="post"
enctype="multipart/form-data">
<p>alegeti fisierele de incarcat:<br>
<input type="file" name="fi iere[]" /><br>
<input type="file" name="fi iere[]" /><br>
<input type="file" name="fi iere[]" /><br>
<input type="submit" value="Incarca" />
</p>
</form>
</body>
</html>
Fi ierul upload.php
<?php
foreach ($_FILES["fi iere"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["fi iere"]["tmp_name"][$key];
$name = $_FILES["fi iere"]["name"][$key];
move_uploaded_file($tmp_name, "data/$name");
}
}
?>

n formular nu apar mari deosebiri fa de Exemplul 11, doar numele cmpurilor este identic i
postfixat de [] (perechi de paranteze drepte). n upload.php se observ c indicele ce
specific fiecare fi ier n parte este ultimul n irul celor trei indici asocia i variabilei
superglobale $_FILE.
Observatia 3. Urm toarele directive din php.ini pot influen a nc rcarea fi ierelor pe
server utiliznd formularul de nc rcare: file_uploads, upload_max_filesize,
upload_tmp_dir, post_max_size i max_input_time.
12

Modulul 3. Lucrul cu fisiere

ne reamintim...
Fisierele sunt colectii de informatii stocate pe un dispozitiv de stocare (hard-disk,
CD, etc). In functie de formatul datelor continute fisierele se impart in doua
categorii: fisiere text si fisiere binare.
In orice limbaj de programare, si deci si in PHP, cand se lucreaza cu fisiere trebuie
efectuate urmatoarele operatiuni:
- deschiderea fisierului
- citirea din fisier/scrierea in fisier
- inchiderea fisierului
Necesitatea fiecarei operatiuni este probabil usor de inteles. Un fisier trebuie
deschis pentru a putea vedea ce este in el - chiar si pentru o secventa de cod aceasta
este o necesitate. Scrierea/citirea propriu-zisa reprezinta operatia pentru care
fisierul a fost deschis, prin care sunt preluate sau adaugate informatii in fisier. La
finalul folosirii fisierului acesta trebuie sa fie inchis, altfel este posibil ca
informatiile continute sa se piarda.

nlocui i zona punctat cu termenii corespunz tori.


1. Functia . accepta 2 parametri: numele(inclusiv calea) fisierului si un string
care indica . a fisierului. Exista mai multe moduri ce pot fi utilizate in
functia .. :
'r' - deschidere pentru ..
'w' - deschidere pentru cu distrugerea continutului existent
'a' - deschidere pentru .. cu pastrarea continutului existent (adaugare
la)
2. Functia "." ofera informatii despre dimensiunea fisierului de pe disc.
3. PHP va inchide in mod automat fisierul, dar este totusi indicata apelarea
functiei "..". Unul dintre avantajele apelarii din script a functiei de a
fisierului este chiar identificarea blocului de manipulare a fisierului.
4. Pentru a crea un director, invoca i func ia ., care are urm toarea form :
(nume_director,)
unde nume_director este calea . sau relativ .
5. Ca i.. , directoarele au privilegii asociate. Privilegiile unui director se
noteaz folosind acelea i litere care indic privilegiile fi ierelor; cu toate acestea,
literele au semnifica ii oarecum diferite atunci cnd se aplic asupra
directoarelor:
- r, directorul poate fi.; cu alte cuvinte, sub-directoarele i fi ierele pe care le
con ine pot fi afi ate
- w, directorul poate fi..; cu alte cuvinte, sub-directoarele i fi ierele pe care le
con ine pot fi create n catalog i apoi terse de acolo.
- , directorul se poate folosi, cu alte cuvinte, sub-directoarele i fi ierele pe
care le con ine sunt accesibile.

13

Modulul 3. Lucrul cu fisiere

M3.U1.10.
Test de evaluare a cuno tin elor
Marca i varianta corect .
1.Functia ...... este folosita pentru a citi o singura linie dintr-un fisier si este folosita in lucrul
cu fisiere text. Pentru a citi date binare sau alte segmente specifice unui fisier, ar trebui sa se
foloseasca functia ......
a) fgets(), fseek()
c) fputs(), fgets()
b) fread(), fgets()

d) fgets(), fread()

2. Desi resursele fisier sunt automat inchise la sfarsitul unui request in PHP, ele se pot inchide
explicit apeland functia ....... :
a) fopen()
c) fclose()
d) fgets()
b) print()
3. Consideram urmatorul script PHPcare citeste un fisier linie cu linie dintr-un fisier text. Care
apel de functie ar trebui inserat in locul specificat de semnele de intrebare pentru a face
scriptul sa functioneze corect ?
<?php
$file = fopen("test", "r");
while(!feof($file)) {
echo ????????????;
}
fclose($file);
?>
a) file_get_contents($file)
c) read_file($file)
b) file($file)
d) fgets($file)
4. Care din urmatoarele functii returneaza continul fisierului intr-un mod in care acesta poate
fi folosit ca parte a unei expresii? Alegeti 2 raspunsuri.
a) file_get_contents()
c) fopen()
b) fgets()
d) file()
5. Considerand urmatorul script, ce ar trebui sa contina fisierul fisierulmeu.txt la sfarsitul
executiei?
<?php
$array = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$f = fopen ("fisierulmeu.txt", "r");
for ($i = 0; $i < 50; $i++) {
fwrite ($f, $array[rand(0, strlen ($array) - 1)]);
}
?>
a) Nimic, pentru ca $array nu este de
c) O secventa random de 50 caractere
fapt un sir, ci un string

14

Modulul 3. Lucrul cu fisiere


b) O secventa random de 49 caractere

d) Nimic, daca fisierul nu exista


scriptul va afisa o eroare.

6. Ce face functia built-in delete?


a) Sterge un fisier
c) Sterge o coloana din baza de date
b) Sterge un director
d) Aceasta functie nu exista!
7. Ce parametrii trebuie trimis fucntiei fopen() pentru a deschide un fisier pentru citire si
scriere?(Alegeti 2 raspunsuri)
a) w
c) a
b) r
d) +
8. Care din urmatoarele functii citesc intregul continut al unui fisier? (Alegeti 2 raspunsuri)
a) fgets()
c) fread()
b) file_get_contents()
d) readfile()
9. Care functie este destinata in mod specific pentru a scrie un string intr-un fisier text?
a) fputs
c) fgets
b) fread
d) fopen
10. Presupunand ca se doreste deschiderea unui fisier intr-o aplicatie PHP, care sa atentioneze
printr-un warning, dar sa continue executia in cazul in care fisierul nu este gasit, ce functie ar
trebui folosita?
a) include()
c) nowarn()
b) require()

d) getFile(false)

n aceasta unitate de invatare am studiat modul n care PHP poate interac iona cu
fi iere externe aplica iei. n func ie de modul n care a fost deschis fluxul ata at
unui fi ier extern putem crea, ad uga sau citi dintr-un fi ier. De asemenea, PHP
pune la dispozi ie o serie de func ii predefinite pentru copierea, tergerea sau
testarea unui fi ier. Putem lucra cu pointerul ata at fi ierului, modificndu-i pozi ia
n func ie de anumite cerin e. Ca aplica ie, am studiat modul n care putem stoca
datele dintr-un formular ntr-un fi ier extern. Fi ierele externe pot fi nc rcate pe
server-ul PHP folosind tag-uri speciale HTML. Dup ce fi ierele au fost nc rcate
putem s le test m atributele sau putem s le salv m n loca ii diferite.

15

Modulul 4. POO in PHP

Modulul 4. Programare Orientata pe Obiecte in PHP

Unitatea de nv are M4.U1. Clase si obiecte in PHP5


Cuprins:
M4.U1.1.
Introducere ........................................................................................................1
M4.U1.2.
Obiectivele unit ii de nv are ..........................................................................2
M4.U1.3.
Concepte de baz ...............................................................................................2
Constructorul ......................................................................................................................3
Destructorul ........................................................................................................................3
Modificatori de vizibilitate..................................................................................................3
Membri statici ....................................................................................................................5
M4.U1.4.
Atribute cu valori constante ...............................................................................6
M4.U1.5.
Crearea obiectelor din clasa predefinit stdClass ..........................................7
M4.U1.6.
Parcurgerea atributelor unei clase cu foreach ................................................7
M4.U1.7.
Mo tenirea ........................................................................................................8
Constructorul clasei derivate ...............................................................................................8
Destructorul clasei derivate .................................................................................................8
Modificatorul de vizibilitate protected ..........................................................................9
M4.U1.8.
Clase i metode finale ........................................................................................9
M4.U1.9.
Clase abstracte................................................................................................. 10
M4.U1.10. Interfe e ........................................................................................................... 11
M4.U1.11. Operatorul instanceof ............................................................................... 12
M4.U1.12. Func ii cu argumente de tip impus ...................................................................13
M4.U1.13. Func ii magice .............................................................................................14
Getter-i i setter-i .............................................................................................................. 14
__toString() ...................................................................................................................... 16
__isset() ............................................................................................................................16
__unset() .......................................................................................................................... 16
__call() .............................................................................................................................17
M4.U1.14. Obiecte i referin e .......................................................................................... 17
M4.U1.15. Clonarea obiectelor ......................................................................................... 19
M4.U1.16. Compararea obiectelor..................................................................................... 20
M4.U1.17. Test de evaluare a cuno tin elor .......................................................................22
M4.U1.1. Introducere
Acest capitol i propune detalierea implement rii n PHP a program rii orientate
pe obiect (POO) i a propriet ilor sale. Plec m de la ipoteza c cei care citesc
acest capitol au no iunile teoretice relativ la POO bine nsu ite.

Modulul 4. POO in PHP


M4.U1.2. Obiectivele unit ii de nv are
Aceast unitate de nv are i propune ca obiectiv principal lucrul cu sesiuni in
PHP. La sfr itul acestei unit i de nv are studen ii vor cunoaste urmatoarele:
Concepte de baz privind sintaxa unei clase n PHP, constructor,
destructor, modificatori de vizibilitate, membri statici, atribute cu valori
constante
Mo tenirea, sintaxa privind mo tenirea n PHP. Modificatorul protected,
modificatorul final
Clase abstracte
Interfe e
Metode cu parametri de tip impus
Func ii magice
Obiecte i referin e
Clonarea obiectelor
Compararea obiectelo
Durata medie de parcurgere a unit ii de nv are este de 4 ore.

M4.U1.3. Concepte de baz


O clas , n general, descrie o colec ie ncapsulat de membri mp
i n: variabile numite i
atribute, care dau starea unui obiect ob inut prin instan ierea clasei, i func ii numite i
metode, care manipuleaz starea obiectului.
Din punct de vedere sintactic o clas se define te n PHP astfel:
<?php
class NumeClasa {
// proprietetile si metodele clasei
}
?>

unde:
class este cuvnt rezervat PHP, ce precede n mod obligatoriu definirea unei clase;
NumeClasa este un identificator. Conform conven iei de nume PHP, identificatorul

pentru numele clasei va ncepe cu o liter mare, iar dac este format din mai multe
cuvinte, fiecare cuvnt va ncepe cu liter mare.
Perechea de acolade este obligatorie.
n PHP, o clas poate avea oricte atribute, de aproape orice tip. Ca func ii, clasa are metodele
clasice pentru construirea sau distrugerea unui obiect, adic constructor respectiv destructor,
metode de control sau modificare a st rii, adic getter-i respectiv setter-i, precum i alte
metode definite de utilizator.
PHP permite valori predefinite pentru atributele clase. Aceste valori pot fi doar constante, nu
valori returnate de o func ie, valorile unei variabile etc.

Modulul 4. POO in PHP


Odat clasa definit vom putea crea obiecte. Obiectele sunt instan e ale clasei. ntr-o instan
atributele clasei au valori concrete. Crearea unui obiect se face prin cuvntul rezervat new care
determin apelul constructorului clasei. Obiectul creat va putea fi atribuit apoi unei variabile.
Dup ce un obiect a fost construit i atribuit unei variabile, accesul la membrii s i se face prin
operatorul de selec ie -> (succesiunea de semne minus, mai mare) sub forma $obiect ->
membru. Accesul direct la membrul unei clasei se face doar dac modificatorul de vizibilitate
permite aceasta (vezi paragraful referitor la modificatori de vizibilitate).
Pentru a referi obiectul curent (spre ex. din interiorul clasei) putem folosi pseudovariabila
$this. Prin $this avem acces la oricare dintre membrii clasei prin constructia $this ->
membru.
Constructorul
n PHP fiecare clas trebuie sa aib definit un constructor. PHP furnizeaz constructorul
implicit, dar de ndat ce s-a definit un constructor de c tre programator, cel implicit nu mai
poate fi apelat. Pentru c PHP nu permite supranc rcarea func iilor, o clas are un singur
constructor. Definirea constructorului de c tre programator se face prin urm toarea sintax :
function __construct(lista_atribute){
//cod de definire a constructorului
}

unde:
function este cuvnt rezervat PHP necesar deoarece constructorul este o func ie;
__construct, numele predefinit al constructorului (Aten ie! Cuvntul construct este

precedat de dou underscore-uri);


ntre paranteze rotunde avem lista valorilor pentru atributele ce se ini ializeaz sau se
definesc, desp ite prin virgul , list ce poate fi vid .
Aceast sintax a constructorului este valabil numai n PHP 5.
Destructorul
n majoritatea limbajelor de programare rolul fundamental al destructorului este eliberarea
spa iului de memorie ocupat de un obiect. n PHP rolul destructorului se rezum mai ales la
nchideri de conexiuni cu diverse servere, nchideri de fluxuri, etc. Destructorul este apelat
implicit atunci cnd toate referin ele c tre un anumit obiect dispar, dar poate fi apelat i
explicit.
Sintaxa unui destructor n PHP este urm toarea:
function __destruct(){
//cod de definire a destructorului
}

Destructorul nu admite parametri.


Modificatori de vizibilitate
n PHP exist trei modificatori de vizibilitate pentru membrii unei clase: public, private i
protected.

Modulul 4. POO in PHP


Dac modificatorul de vizibilitate este public, membrul este accesibil din orice obiect
instan a clasei sau a oric rei clase derivate (vezi paragraful referitor la mo tenire).
Dac modificatorul de vizibilitate este private, atunci membrul este accesibil doar n clasa
curent . Obiectele, instan e ale clasei, sau clasele derivate vor accesa membrul private doar
prin intermediul altor membri (vezi paragraful referitor la mo tenire).
Despre modificatorul protected vom discuta n paragraful referitor la mo tenire.
Pentru atributele unei clase trebuie specificat n mod obligatoriu un
modificator de vizibilitate. n cazul metodelor se consider implicit modificatorul public.
Observatia 1.

Exemplul 1. Crearea unei clase, instan ierea clasei i accesul la membrii clasei
Fi ierul: clasa.php
<?php
class Clasa{
public $var=6;
function __construct($v){
$this->var=$v;
}
}
?>
Fi ierul: test.php
<?php
include "clasa.php";
$inst=new Clasa(9);
echo $inst->var;
?>

Regula de stil, atunci cnd se construie te o clas , este ca ea sa fie salvat ntr-un fi ier
propriu, de obicei avnd numele clasei. A adar, n Exemplul 1, am definit clasa Clasa ntr-un
fi ier cu numele clasa.php. n defini ia clasei avem ca atribut pe $var ini ializat cu valoarea
6. Dac nu am fi definit constructorul, n mod predefinit, la crearea unui obiect, s-ar fi folosit
un constructor, f
parametri, care ar fi p strat valoarea predefinit a atributului. n
constructorul definit de noi modific m valoarea predefinit la o nou valoare, dat de
parametrul constructorului. n acest moment nu am mai putea folosi constructorul f
parametri dect dac am crea un constructor cu parametri cu valori predefinite.
function __construct($v=11){
...
}

n fi ierul test.php am inclus mai nti fi ierul ce con ine clasa, am creat obiectul $inst i
am tip rit valoarea parametrului. Acest lucru a fost posibil pentru c am avut drepturi date de
modificatorul de vizibilitate public.
n Exemplul 1 a trebuit s includem explicit n fi ierul test.php fi ierul clasa.php pentru c
acesta con ine clasa invocat , Clasa, la instan ierea obiectului $inst. Acest mod de lucru

Modulul 4. POO in PHP


poate fi uneori deranjant, spre exemplu atunci cnd avem multe clase de inclus sau numele
claselor invocate este dinamic.
ncepnd cu PHP 5 avem la dispozi ie func ia autoload() ce trebuie supradefinit
apelat automat atunci cnd invoc m o clas care nu a fost inclus nc .

i care este

Putem modifica fi ierul test.php din Exemplul 1 astfel nct, n loc s apel m func ia
include()definim func ia autoload() care rezolv problema includerii pentru toate clasele
necesare.
Fi ierul: test.php
<?php
function __autoload($class_name) {
require_once $class_name.'.php';
}
$f=7;
$inst=new Clasa($f);
echo $inst->var;
?>

Trebuie remarcat faptul c folosirea acestei func ii determin anumite particularit i:


fi ierul care con ine clasa se afl n acela i director cu cel care o invoc . Altfel, ar
trebuie stabilit calea c tre acel fi ier;
numele clasei este identic cu numele fi ierului (nu neap rat case-sensitive);
extensia este adaugat prin concatenare.

Membri statici
Declararea membrilor unei clase drept static ofer acces direct la ei innd cont doar de
modificatorul de vizibilitate. Acces direct nseamn f
a crea o instan a clasei, ci direct
prin numele clasei (Exemplul 2).
Declararea static se face prin folosirea cuvntului rezervat static.
Atributele statice au o valoare unic pentru toate instan ele clasei. Celelalte atribute sunt
distincte fiec rei clase, iar valorile lor sunt ini ializate de c tre constructor.
n definirea metodelor statice trebuie s folosim doar atribute sau expresii care nu au de-a face
cu starea obiectului. Spre exemplu, folosirea pseudovariabilei $this este interzis ntr-o
func ie static . Constructorul i destructorul nu pot fi statici.
Pentru metode nu este obligatorie calificarea prin static. Putem apela
metoda ca pe una static , dac n defini ia ei nu folosim starea obiectului.
Observatia 2.

Din punct de vedere sintactic, accesul la un membru static se face prin operatorul domeniu,
:: (pereche de dou puncte), i nu prin operatorul de selectie, ->. De asemenea,
operatorul se aplic numelui clasei i nu vreunui obiect, instan a clasei (Exemplul 2).

Modulul 4. POO in PHP


PHP pune la dispozi ie dou nume generice de clase i anume clasa curent , self, i clasa
rinte, parent. Clasa curent este folosit pentru a invoca membrii statici n contextul clasei.
Despre clasa p rinte vom discuta n paragraful referitor la mo tenire.
Exemplul 2. Membri statici
Fi ierul: clasa.php
<?php
class Clasa{
public static $var=6;
private $a=3;
function mesaj(){
echo "salut ".self::$var."!<br>";
}
function x(){
echo "$this->a";
}
}
?>
Fi ierul: test.php
<?php
function __autoload($class_name) {
require_once $class_name.'.php';
}
$ob=new Clasa();
echo Clasa::$var."<br>";
echo Clasa::mesaj();
$ob->x();
?>

n clasa Clasa am declarat variabila static , public $var i cea nestatic (specific fiec rui
obiect) $a. Func ia mesaj(), de i nedeclarat n mod explicit, este considerat static (vezi
apelul din test.php). A a cum este declarat ea ar putea fi invocat i prin operatorul clasic
->. Folosirea numelui generic self, n clasa.php, este necesar pentru a specifica despre ce
variabil $var este vorba, cea a clasei, nu cea local a func iei.

M4.U1.4. Atribute cu valori constante


PHP permite declararea atributelor cu valori constante. Din punct de vedere sintactic, un
atribut constant este prefixat de cuvntul rezervat const, iar identificatorul nu mai este
prefixat de semnul $. Valoarea atributului trebuie s fie dat de o constant , nu de o
expresie sau de nu un apel al unei func ii. F
alte precizari o constant este un membru
public i static (Exemplul 3). Valorile acestui membru nu pot fi modificate.
Exemplul 3. Atributele constante ale unei clase
Fi ierul: clasa.php
<?php
class Clasa{
const con=6;

Modulul 4. POO in PHP

static function mesaj(){


echo "salut ".self::con."!<br>";
}
}
?>

Fi ierul: test.php
<?php
function __autoload($class_name) {
require_once $class_name.'.php';
}
echo Clasa::con."<br>";
echo Clasa::mesaj();
?>

M4.U1.5. Crearea obiectelor din clasa predefinit stdClass


n PHP putem crea un obiect pornind de la un tip oarecare. Astfel, apelnd la conversia
explicit (object) cre m un obiect, instan a clasei predefinite PHP stdClass, care are ca
valori ale atributelor valorile variabilei sau constantei de tipul considerat.
Dac membrul drept este altul dect array, atributul clasei se va numi scalar, altfel atributele
se vor numi dup numele cheii elementelor. De aceea, nu se recomand folosirea indec ilor
predefini i ai array-ului pentru c membrii nu vor mai putea fi apoi accesa i n cadrul
obiectului.
Exemplul 4. Instan a clasei stdClass
<?php
$a=(object)array("i"=>1,2);
echo $a->i;
echo $a->{0};
?>

Cel de-al doilea atribut nu va putea fi accesat din cauza lipsei cheii.
M4.U1.6. Parcurgerea atributelor unei clase cu foreach
Putem folosi instruc iunea foreach i pentru a afi a atributele unei clase. Vom ob ine pentru
atributele vizibile numele i valoarea atributului. Sintaxa general este:
foreach(obiect as nume => valoare){
//codul instructiunii
}

unde, obiect este o instan


atunci obiect este $this.

a unei clase. Dac folosim foreach n defini ia clasei curente

Modulul 4. POO in PHP


M4.U1.7. Mo tenirea
Unul dintre principiile esen iale ale program rii orientate pe obiect este refolosirea codului,
iar o modalitate de implementare a acestui principiu este prin mo tenire. i n PHP putem
extinde o clas ini ial (numit i clas de baz sau p rinte) prin crearea unei noi clase
(numit i clas derivat ) care s mo teneasc toate propriet ile i metodele clasei parinte.
n PHP nu este implementat conceptul mo tenirii multiple (ca n C++, spre exemplu). A adar,
o clas poate mo teni doar o clas de baz , dar o clas de baz poate fi mo tenit de oricte
clase derivate. Aceasta se numeste mo tenire simpl . Prin procesul de mo tenire putem ob ine
ierarhii de clase.
n clasa derivat putem ad uga noi atribute, noi metode, putem redefini metodele din clasa de
baz sau le putem utiliza nemodificat. Pentru a referi membrii din clasa de baz putem folosi
clasa generic parent i operatorul domeniu, ::.
Din punct de vedere sintactic mo tenirea este implementat prin cuvntul rezervat extends
(class ClasaDerivata extends ClasaBaza).
Constructorul clasei derivate
Dac clasa de baz define te propriul constructor, atunci acesta nu este apelat n mod implicit
n clasa derivat . Clasa derivat trebuie s -l apeleze explicit prin parent::__construct().
Constructorul clasei de baz este responsabil de ini ializarea atributelor din clasa de baz , iar
cel din clasa derivat de atributele respective.
Destructorul clasei derivate
Ca i n cazul constructorului i pentru destructor trebuie f cut un apel explicit dac n clasa
de baz s-a modificat destructorul predefinit (parent::__destruct()).
Exemplul 5. Clase derivate
Fi ierul: clasabaza.php
<?php
class ClasaBaza{
private $var;
function __construct($a){
$this->var=$a;
}
function afisare(){
echo $this->var."<br>";
}
}
?>
Fi ierul: clasaderivata.php
<?php
class ClasaDerivata extends ClasaBaza{
private $v;
function __construct($a, $b){
parent::__construct($a);
$this->v=$b;
}

Modulul 4. POO in PHP


function afisare(){
parent::afisare();
echo $this->v."<br>";
}
}
?>
Fi ierul: test.php
<?php
function __autoload($class_name) {
require_once $class_name.'.php';
}
$obBaza=new ClasaBaza(55);
$obDerivat=new ClasaDerivata(33,6);
$obBaza->afisare();
$obDerivat->afisare();
?>

Am organizat aplica ia n trei fi iere: clasabaza.php i clasaderivata.php ce con in


defini iile celor dou clase, iar test.php fi ierul ce creaz obiecte i le apeleaz . n clasa
derivat am mai ad ugat un atribut, $v, pe care l ini ializ m n constructor. Constructorul
clasei derivate are doi parametri. Primul parametru va fi folosit pentru apelul constructorului
din clasa de baz , iar cel de-al doilea n defini ia constructorului curent. Metoda afisare()
din clasa de baz a fost redefinit n clasa derivat . Redefinirea nu a fost total , adic am
ad ugat i o parte din defini ia din clasa de baz , prin apelul parent::afisare(). Dup cum
se observ n clasa de test, afi area este dependent de obiectul care o con ine. Pentru obiectul
instan a clasei de baz se apeleaz metoda din clasa de baz , iar pentru cel din clasa derivat
metoda respectiv , redefinit .
Modificatorul de vizibilitate protected
n Exemplul 5, fi ierul clasaderivata.php, nu avem acces direct la atributul $var, pentru c
acesta este private n clasa de baz . PHP, ca i alte limbaje, permite o relaxare a caracterului
privat al atributelor, n interiorul unei ierarhii de clase. Astfel, putem avea acces direct la
atributul $var din interiorul tuturor claselor derivate din ClasaBaza dac schimb m
modificatorul de vizibilitate din private n protected. Din exteriorul ierarrhiei avem acces
private la membrii declara i protected.

M4.U1.8. Clase i metode finale


PHP poate inhiba caracterul de clas de baz . Astfel, o clas declarat final nu mai poate fi
clas de baz n procesul mo tenirii. ncercarea de extindere a unei clase finale este
generatoare de erori fatale.
n acela i mod i metodele pot fi finale. Aceasta nseamn c , n ierarhia de clase, metoda
declarat final nu mai poate fi redefinit n clasele derivate. Dac n Exemplul 5, am folosi n
clasa de baz :
final function afisare(){
echo $this->var."<br>";
}

Modulul 4. POO in PHP

iar restul aplica iei ar ramne nemodificat, atunci am genera o eroare fatal de redefinire a
unei metode finale.
M4.U1.9. Clase abstracte
Exist situa ii n care nu putem defini ntreaga func ionalitate a unei clase (nu avem nc
suficiente informa ii). Totu i, anumite metode trebuie declarate pentru p strarea unei
consisten e a clasei. Metodele nu vor fi, ns , definite dect n clasele derivate, acolo unde
vom avea informa ii suficiente.
O metod care ntr-o clas este doar declarat , nu i definit , este o metod abstract i acest
lucru trebuie pus n eviden prin cuvntul rezervat abstract ce prefixeaz semn tura
func iei. Constructorii i destructorii pot fi abstrac i.
O clas care are cel pu in o metod abstract devine la rndul s u abstract i acest lucru
trebuie pus n eviden prin cuvntul rezervat abstract. O clas abstract nu poate fi
instan iat . Prin derivare, clasei abstracte i se pot furniza defini ii ale func iilor abstracte. Dac
nu se definesc toate func iile abstracte, clasa derivat va deveni abstract i va trebui calificat
abstract.
n momentul definirii metodei abstracte n clasa derivat , aceasta trebuie s aib identic
aceea i semn tur ca la declarare. PHP permite un anumit rabat la accesibilitate. Astfel,
modificatorul de vizibilitate poate fi mai permisiv n clasa derivat dect n clasa abstract
(spre ex. poate fi public n loc de protected, dar nu poate fi private n loc de protected).

Exemplul 6. Clasa abstract


Fi ierul: clasabaza.php
<?php
abstract class ClasaBaza{
protected $var;
function __construct($a){
$this->var=$a;
}
abstract function afisare();
}
?>
Fi ierul: clasaderivata.php
<?php
class ClasaDerivata extends ClasaBaza{
private $v;
function __construct($a, $b){
parent::__construct($a);
$this->v=$b;
}
function afisare(){
echo $this->var." ".$this->v."<br>";
}

10

Modulul 4. POO in PHP


}
?>
Fi ierul: test.php
<?php
function __autoload($class_name) {
require_once $class_name.'.php';
}
$obDerivat=new ClasaDerivata(33,6);
$obDerivat->afisare();
?>
n clasabaza.php metoda afisare() este abstract

(cuvntul rezervat abstract i lipsa


de definire). Aceea i semn tur
este folosit
la definire n
clasaderivata.php. n clasaderivata.php avem acces la atributul $val prin
pseudovariabila $this pentru c a fost declarat protected n clasabaza.php. Obiectul din
test.php este instan a clasei derivate, ce implementeaz metoda afisare().
oric rui

detaliu

M4.U1.10.
Interfe e
Interfe ele sunt cele mai abstracte clase cu putin . O interfa nu con ine niciun detaliu de
implementare, ele sunt practic o colec ie de metode abstracte i publice sau atribute constante
i publice.
Practic, interfa a impune ce metode trebuie s implementeze o clas . Clasa care nu
implementeaz toate metodele devine abstract i trebuie marcat prin cuvntul rezervat
abstract.
O interfa se define te asem
folose te interface.

tor cu o clas , singura modificare este c n loc de class se

interface Interfata{
// metode statice
}

i atribute constante

O clas poate implementa oricte interfe e, separate prin virgul . Implementarea se face
asem tor extinderii, doar c n loc de extends se folose te implements.
Exemplul 7. Definirea i implementarea unei interfe e
Fi ierul: interfata.php
<?php
interface Interfata{
const atr=8;
function afisare();
}
?>
Fi ierul: clasaderivata.php
<?php
class ClasaDerivata implements Interfata{
private $v;
function __construct($a){
$this->v=$a;

11

Modulul 4. POO in PHP


}
function afisare(){
echo Interfata::atr." ".$this->v."<br>";
}
}
?>
Fi ierul: test.php
<?php
function __autoload($class_name) {
require_once $class_name.'.php';
}
$obDerivat=new ClasaDerivata(33);
$obDerivat->afisare();
?>

Interfe ele pot fi extinse de c tre alte interfe e, n mod asem tor claselor,
doar c aici este posibil extinderea multipl (interface Interfata1 extends
Interfata2, Interfata3). Att n cadrul extinderii de interfe e, ct i n cadrul
implement rii mai multor interfe e, trebuie avut grij la numele metodelor. O interfa nu
poate extinde alte interfe e dac au metode cu nume identic. O clas nu poate implementa
interfe e n care se reg sesc metode cu acela i nume.
Observatia 3.

M4.U1.11.
Operatorul instanceof
Este un operator care testeaz dac un obiect este instan a unei clase. Sintaxa general este:
obiect instanceof nume_clasa

unde:
obiect a fost instan iat prin operatorul new;
nume_clasa este numele unei clase, clase abstracte sau interfe e.

Rezultatul expresiei este TRUE sau FALSE.


Exemplul 8. Rezultate ale test rii instan ei cu instanceof

a dup cum se cunoa te, o clas de baz este compatibil cu orice clas
derivat n ierarhia sa de clase. Acela i lucru este valabil i pentru interfe e. Intr-o
ierarhie de clase, clasele surori nu sunt compatibile. Asadar, n Exemplul 7:
$obDerivat instanceof ClasaDerivata //TRUE
$obDerivat instanceof Interfata //TRUE

n Exemplul 5:
$obDerivat instanceof ClasaBaza //TRUE
$obBaza instanceof ClasaDerivata //FALSE

12

Modulul 4. POO in PHP

M4.U1.12.
Func ii cu argumente de tip impus
Pn n acest moment argumentelor func iilor nu li se impunea, n semn tur , un tip anume.
ncepnd cu PHP 5 putem declara argumente c rora s le impunem un anumit tip, dintre cele
acceptate, adic class sau array. n cazul obiectelor se va specifica numele clasei (inclusiv
un nume generic), iar n cazul tipurilor array se va folosi cuvntul rezervat array, f
alte
specifica ii. Putem, n plus, s preciz m dac argumentul poate primi i valoarea NULL.
Exemplul 9. Func ii cu argumente cu tip
Fi ierul: comparare.php
<?php
interface Comparare{
function compara(self $s);
}
?>
Fi ierul: clasa.php
<?php
class Clasa implements Comparare{
public $v;
public function compara(self $a){
if($this->v<$a->v)
return -1;
else if($this->v==$a->v)
return 0;
else return 1;
}
function __construct($a){
$this->v=$a;
}
}
?>
Fi ierul: test.php
<?php
function __autoload($class_name) {
require_once $class_name.'.php';
}

function maxim(Comparare $a, Comparare $b){


if($a->compara($b)<0)
return $b;
else return $a;
}
$x= new Clasa(7);
$y= new Clasa(4);
$max=maxim($x,$y);
echo "maximul este: ".$max->v;
?>

13

Modulul 4. POO in PHP

Interfa a Comparare precizeaz semn tura unei metode, compara(), ce are un argument de tip
interfa a curent i care, prin definire, va furniza o metod de comparare a dou obiecte ce
implementeaz interfa a.
Func ia compara(), a a cum este definit n Clasa, reprezint practic func ia semn. De
remarcat dou aspecte. Primul este folosirea numelui generic self, ceea ce conduce la
nespecificarea explicit a conversiei ntre Comparare i Clasa. Al doilea este semn tura
func iei ce se defineste i care este identic cu cea din interfa .
n fi ierul test.php, am definit func ia de aflare a maximului, func ie ce are dou argumente
de tip Comparare. Doar clasele ce implementeaz interfa a Comparare pot fi argumente ale
acestei func ii. Prin aceasta ne asigur m c obiectele c rora le dorim aflarea maximului se pot
compara. n plus, dac vrem s afl m c cele dou argumente, $a i $b, sunt instan e ale
aceleia i clase putem folosi operatorul instanceof.
Despre compararea obiectelor vom mai discuta n sec iunile urm toare.

M4.U1.13.
Func ii magice
PHP, ncepnd cu versiunea 5, posed o serie de func ii care se autoapeleaz n anumite
condi ii, cunoscute i sub numele de func ii magice. Numele lor este prefixat de __ (dou
underscore-uri). Pn n acest moment am studiat trei dintre ele __construct(),
__destruct() i __autoload(). Vom mai prezenta, n continuare, cteva dintre cele mai
frecvent utilizate.
Getter-i i setter-i
a cum am afirmat i n sec iunile precedente starea unui obiect este recomandat a fi ascuns
de accesul neautorizat (atributele sunt declarate private). Pentru a putea manipula starea
unui obiect, programatorii definesc func ii pentru modificarea st rii (setter-i) respectiv pentru
accesarea acesteia (getter-i) i apoi le apeleaz n afara defini iei clasei, prin intermediul unei
instan e.
PHP rezolv problema mult mai elegant pe baza unor func ii care se autoapeleaz :
pentru setare avem urm toarea sintax general :
function __set(nume, valoare){
//codul pentru setarea valorii unui atribut private
}

unde, nume este numele atributului a c rui valoare dorim s o set m i care este
inaccesibil din clasa ce define te func ia __set(), respectiv valoare este valoarea
nou a atributului;
pentru acces avem urm toarea sintax general :
function __get(nume){
//codul pentru accesul la valorea unui atribut private
//trebuie sa contina return
}

14

Modulul 4. POO in PHP


unde, nume este numele atributului a c rui valoare dorim s o acces m i care este
inaccesibil din clasa ce define te func ia __get(). Rezultatul returnat este valoarea
atributului.

Exemplul 10.
Getter-i i setter-i
Fi ierul: clasa.php
<?php
class Clasa{
private $v;
private $sir=array();
function __construct($a){
$this->v=$a;
}
function __set($nume,$valoare){
if(is_array($this->nume))
foreach($valoare as $cheie=>$val)
$this->nume[$cheie]=$val;
else
$this->nume=$valoare;
}
function __get($nume){
return $this->nume;
}
}
?>
Fi ierul: test.php
<?php
function __autoload($class_name) {
require_once $class_name.'.php';
}
$ob=new Clasa(33);
$ob->sir=array(7=>7,"indice"=>8);
var_dump($ob->sir);
?>

n clasa Clasa avem dou atribute private. $v a fost ini ializat prin constructor, iar $sir este
un array gol, creat n mod predefinit. n mod clasic nu avem acces la aceste atribute prin
construc ii de felul: $ob->v, unde $ob este o instan a clasei Clasa. De obicei accesul se face
printr-o construc ie: $ob->getV(), unde getV() este o func ie public ce returneaz valoarea
lui $v. n Clasa am definit func iile __set() i __get().
Func ia __set()din Exemplul 10 construie te o modalitate de atribuire de valori unor atribute
ale clasei Clasa. Modul de lucru este urm torul: mai nti testeaz dac numele atributului
este asociat unui tip array (prin func ia predefinit PHP is_array()) i n caz afirmativ
parcurge cel de-al doilea parametru al func iei printr-o instruc iune foreach modificnd
fiecare element din $sir cu valorile date de $val. Altfel, este vorba de un tip primitiv si
atribuirea are loc direct.
15

Modulul 4. POO in PHP

a dup cum se observ n fi ierul test.php, dup ce am definit cele dou func ii accesul
este direct la atributele private. Func ia predefinit PHP var_dump() afi eaz propriet ile
variabilei parametru.

__toString()
Frecvent avem nevoie s afi m anumite caracteristici ale clasei (starea ei sau o parte a
acesteia). n POO, se define te o func ie toString() care modeleaz conversia clasei la un
string. Aceast conversie este folosit la afi ri de tipul echo, print, etc.
i pentru aceast opera ie PHP pune la dispozi ie o func ie magic cu urm toarea sintax :
function __toString(){
//cod de conversie la string
}

n Exemplul 9 putem completa defini ia clasei Clasa cu:


function __toString(){
return "valoarea: $this->v";
}

iar n fi ierul test.php putem testa autoapelul acesteia prin:


echo $ob;

__isset()
Este invocat de func iile predefinite PHP isset() sau empty() pentru atribute inaccesibile.
Sintaxa general este:
function __isset(nume){
//cod de testare
}

__unset()
Este invocat de func ia predefinit
general este:

PHP unset() pentru atribute inaccesibile. Sintaxa

function __unset(nume){
//cod de testare
}

Vom completa defini ia clasei Clasa din Exemplul 10 cu aceste func ii.
function __isset($nume) {
return isset($this->nume);
}
function __unset($nume) {
unset($this->nume);
}

16

Modulul 4. POO in PHP


Iar n fi ierul test.php test m autoapelul lor:
var_dump(isset($ob->v));
unset($ob->v);
var_dump(isset($ob->v));

__call()
PHP extinde no iunea de getter pentru func ii. Astfel, pune la dispozi ie func ia _call() care
va apela o func ie inaccesibil din contextul curent. Sintaxa general este:
function __call(nume, argumente){
//codul pentru apelul unei func ii inaccesibile
}

unde, nume este numele metodei pe care dorim s o apel m i care este inaccesibil din clasa
ce define te func ia __call(), respectiv argumente este un array n care sunt p strate
argumentele func iei apelate.
n Exemplul 10 ad ug m o func ie private care returneaz valoarea argumentului:
private function func ie($a){
return $a;
}

Pentru a putea apela direct aceast func ie definim, n aceea i clas , metoda __call()
function __call($nume, $argumente) {
return $this->$nume(implode(', ', $argumente));
}

n defini ia anterioar am apelat func ia predefinit implode() ce returneaz un string format


din elementele unui array, transmis ca al doilea argument. Primul argument al func iei
implode() este separatorul din string a elementelor array-ului.
n fi ierul test.php putem folosi urm torul apel:
echo "<br> rezultatul func iei private este: ".$ob->func ie(7);

M4.U1.14.
Obiecte i referin e
n PHP obiectele sunt transmise ca referin e. Pentru a clarifica situa iile ap rute vom comenta
Exemplul 11.
Exemplul 11.
<?php
class B{
public $y;

Transmiterea obiectelor ca parametri ai unei func ii

function __construct($a){
$this->y=$a;
}
}
class A {
public $x;

17

Modulul 4. POO in PHP


public $z;
function __construct($a){
$this->x=$a;
$this->z=new B($a);
}
}
$e = new A(3);
function f($obj) {
$obj->x = 2;
$obj->z = new B(8);
}
f($e);
echo "apel f: ".$e->x." ".$e->z->y."<br>";
function f1($obj) {
$obj=new A(4);
}
f1($e);
echo "apel f1: ".$e->x." ".$e->z->y."<br>";
function f2(&$obj) {
$obj=new A(4);
}
f2($e);
echo "apel f2: ".$e->x." ".$e->z->y."<br>";
?>

Am definit, ini ial, o clas , B, care con ine un atribut public (pentru u urarea accesului), $y,
i un constructor clasic, cu un parametru. Clasa A are 2 atribute, $x i $z, declarate public,
care prin constructor au fost ini ializate cu valoarea parametrului respectiv instan iate cu clasa
B. Am creat apoi o instan , $e, a clasei A.
Pentru nceput am definit func ia f(), ce prime te ca parametru, la apel, instan a $e. n
aceast func ie am modificat valoarea primului atribut al lui $e i am construit un nou obiect
pentru cel de-al doilea. De i nu am transmis explicit parametrul func iei f() ca referin ,
totu i modific rile se reg sesc n afara defini iei (afi area cu echo). Este un prim exemplu de
transmitere a obiectului ca parametru i recunoa terea sa implicit ca referin .
n func ia f1(), cu acela i parametru, am modificat valoarea ntregii instan e prin crearea unui
nou obiect. De data aceasta valoarea modificat nu este recunoscut n exteriorul func iei.
Practic, s-a creat un nou identificator de obiect ce nu mai este recunoscut n exterior. Referin a
implicit nu se refer la noua instan .
Pentru a recunoa te noua instan creat n interiorul func iei am definit func ia f2(), n care
parametrul era explicit tratat ca referin , prin opertorul &.

18

Modulul 4. POO in PHP


M4.U1.15.
Clonarea obiectelor
Prin clonare ntelegem copierea unui obiect ntr-un alt obiect n care atributele au acelea i
valori. Clonarea este diferit de atribuire ($ob1=$ob2), unde ambele variabile v d acela i
obiect. n PHP clonarea se face utiliznd directiva clone:
$ob_clonat= clone $ob_original;

Problema apare atunci cnd clon m atribute obiecte. Practic, n urma clon rii vom avea dou
obiecte distincte, care au atribute distincte, cu excep ia atributelor obiect, care vor fi de fapt
nume distincte ale aceluia i identificator de obiect. Pentru aceasta, PHP pune la dispozitie
func ia autoapelant __clone(), care gestioneaz procesul predefinit de clonare i are
urm toarea sintax :
function __clone(){
//cod ce particularizeaza procesul de clonare implicit al unui obiect
}

O clas nu e obligatoriu s implementeze func ia __clone() dac nu dore te un


comportament special la clonare. Func ia __clone() este apelat implicit de directiva clone.
n Exemplul 12 vom da cteva particularit i ale procesului de clonare.
Exemplul 12.
<?php
class Clasa{
public $atr;
public function __construct($x) {
$this->atr = $x;
}
}
class Clona{
public $ob1;
public $at=array(1,2);
function __clone(){
$this->ob1 = clone $this->ob1;
}
}
$obj = new Clona();
$obj->ob1 = new Clasa(5);
$obj2 = clone $obj;

echo $obj->ob1->atr."<br>";
var_dump($obj->at);
echo "<br>".$obj2->ob1->atr."<br>";
var_dump($obj2->at);
$obj->ob1->atr++;
$obj->at[0]++;
echo "<br>".$obj->ob1->atr."<br>";

19

Modulul 4. POO in PHP


var_dump($obj->at);
echo "<br>".$obj2->ob1->atr."<br>";
var_dump($obj2->at);
?>

Clasa este o clas cu un atribut public. Clona este o clas cu dou atribute public, n care al
doilea a fost ini ializat printr-un ir constant, cu dou valori. Am construit apoi obiectul $obj
ca instan a clasei Clona i n cadrul acestui obiect atributul $obj->ob1 ca instan a clasei
Clasa. Am clonat $obj n $obj2. A a cum se observ prin afi are, valorile celor dou obiecte
sunt identice. Modific m apoi valoarea atributului din $obj->ob1, i primul element din irul
$obj->at. Se observ prin afi are c modificarile din $obj nu afecteaz valorile din obiectul
clonat $obj2. Aceasta se explic prin autoapelul, la clonare, al metodei __clone()din clasa
Clona. Dac metoda nu ar fi existat valorile lui $obj->at i $obj2->at ar fi fost distincte,
dar valorile lui $obj->ob1 i $obj2->ob1 ar fi fost comune pentru c ar referi acela i
identificator de obiect. Metoda __clone() specific faptul c , n procesul de clonare al clasei
Clona, atributul obiect ob va fi la rndul s u clonat, n loc s se creeze doar un alias al s u.

M4.U1.16.
Compararea obiectelor
n PHP pentru compararea egalit ii obiectelor folosim doi operatori:
operatorul de comparatie == (dublu egal). Variabilele obiect sunt egale dac au
acelea i atribute, acelea i valori ale atributelor i sunt instan e ale aceleia i clase.
operatorul de identitate === (triplu egal). Variabilele obiect sunt egale dac i numai
dac ele refer aceea i instan a aceleia i clase (sunt practic alias-uri ale aceluia i
obiect).

Exemplul 13.
<?php
class A{
}

Compararea obiectelor

$a = new A();
$b = new A();
$c = $b;
echo ($a==$b)."<br>"; //TRUE
echo ($a===$b)."<br>";//FALSE
echo ($b===$c)."<br>";//TRUE
?>

20

Modulul 4. POO in PHP


ne reamintim...
OOP (Object Oriented Programming - Programare Orientata pe obiecte) este un
concept (sau tehnica) de programare care trateaza datele si functiile ca obiecte.
Important la acest concept este sa fie inteleasa bine diferenta dintre Clasa (Class)
si Obiect (Object).
- Clasa este o structura de date compacta, care contine variabile (numite
proprietati) si functii (numite metode) prin care se pot crea diferite
instructiuni legate intre ele in acea structura.
- Obiectele sunt elementele din script create cu o clasa, si prin care se pot
folosi proprietatile si metodele din acea clasa.
In OOP (Programarea Orientata pe Obiect) apar termenii: "Encapsulation"
(Incapsulare), "Inheritance" (Mostenire) si "Polymorphism" (polimorfism.).
Mostenirea e abilitatea unei clase de a folosi proprietati si functii definite in alta
clasa din care este extinsa (denumita parinte).
La definirea unei clasei si a elementelor din ea (proprietati, metode) se pot aplica
unele atribute speciale prin care se defineste domeniul lor de lucru (de existenta).
Acest atribut se adauga inaintea variabilei sau a cuvantului function, si poate fi unul
din cuvintele:
- public - valabil in tot scriptul
- private - valabil doar in interiorul acelei clase
- protected - valabil doar in acea clasa si sub-clasele extinse din ea
Metoda constructor e un tip special de functie din interiorul Clasei. Se declara cu
numele __construct (doua caractere "_" in fata). Aceasta metoda este mereu
"public" chiar daca nu se mentioneaza special atributul "public". Diferenta fata de
celelalte functii este aceea ca Metoda Constructor e apelata automat cand se creaza
o instanta la clasa respectiva, codul din ea se executa in momentul cand e creat
obiectul (cu new).

nlocui i zona punctat cu termenii corespunz tori.


1. Prin se intelege transmiterea proprietatilor, constantelor si a
de la o clasa la alta, intr-o structura ierarhica. Prima clasa este
clasa de baza, denumita "..", legata de aceasta se poate crea o subclasa, denumita "."; sub-clasa .. mosteneste proprietatile si
metodele clasei . (cele care sunt cu atribut "public" sau "protected"),
le poate folosi in instructiunile din propriul cod si le transmite cand se
creaza o .. de obiect la ea.
2. Precum metodele declarate cu "final" nu mai pot fi modificate in subclasa. , asa se pot crea si clase care sa ramana. , fara sa se poata
crea din ele alta sub-clasa. Acest lucru se obtine prin adaugarea
cuvantului .. inainte de class.
3. Pe langa atributele: "public", "private" si "protected"; prin care se
defineste . .. al proprietatilor si metodelor; acestea pot fi
create si ca . , astfel, vor apartine exclusiv clasei, si nu pot fi
apelate prin de obiect a clasei, ci direct prin ea, cu operatorul.. .
4. Metoda Destructor se creaza cu numele . (doua caractere '_' la
inceput). Aceasta metoda este opusul lui . Daca metoda e
apelata automat cand se creaza o instanta de obiect la clasa, metoda

21

Modulul 4. POO in PHP


se apeleaza automat cand e stearsa, cu (), instanta la acea clasa.
5. Functii Magice (Magic Methods) si se executa . in situatii mai
speciale, cum ar fi de exemplu __get() pentru accesari de
proprietati...
Cele mai folosite astfel de metode: . , __set(),. si__toString().
- Toate aceste metode magice trebuie sa fie definite cu atribut .
6. Clasele . se declara folosind cuvantul abstract inaintea lui "class".
La aceste tipuri de clase nu se poate crea. , ele pot fi doar mostenite
de alte clase extinse din ele.
In clasele abstracte se definesc si . abstracte, acestea se declara cu
acelasi cuvant "abstract" si fara corpul de acolade, doar . si
parantezele rotunde, cu parametri necesari.

M4.U1.17.
Test de evaluare a cuno tin elor
Marca i varianta corect .
1.Cum trebuie sa fie o clasa astfel incat proprietatile sale sa nu poata fi accesate in afara
metodelor sale?
a) clasa trebuie declarata private
c) nu este posibil in PHP5
b) metodele clasei trebuie declarate
private

d) prin scrierea unei proprietati care sa


suprascrie metoda

2. O clasa poate fi extinsa de alta clasa folosind un proces denumit mostenire. In PHP, cati
parinti poate o clasa copil sa mosteneasca?
a) unul
c) depinde de resursele sistemului
d) cati este nevoie
b) doi
3. Sa presupunem ca o clasa numita testclass este definita. Care trebuie sa fie numele metodei
constructor a clasei?
a) __construct
c) testclass
b) initialize
d) __testclass
4. Cum se cheama metoda metodamea a unei clase din clasa insasi?
a) $self=>metodamea();
c) $current-> metodamea();
b) $this-> metodamea ();
d) nici un raspuns de mai sus.
5. Ce va afisa urmatorul script?
<?php
class my_class
{
var $my_var;
function _my_class ($value)
{
$this->my_var = $value;
}
}
$a = new my_class (10);
echo $a->my_var;
22

Modulul 4. POO in PHP


?>
a) 10
b) Null
6. Ce va afisa urmatorul script(PHP5)?
<?php
class my_class
{
var $value;
}
$a = new my_class;
$a->my_value = 5;
$b = $a;
$b->my_value = 10;
echo $a->my_value;
?>
a) 10
b) 5
7. Ce va afisa urmatorul script?
<?php
class a
{
function a ($x = 1)
{
$this->myvar = $x;
}
}
class b extends a
{
var $myvar;
function b ($x = 2)
{
$this->myvar = $x;
parent::a();
}
}
$obj = new b;
echo $obj->myvar;
?>
a) 1

c) Nimic
d) O eroare

c) 2
d) Null

c) o eroare pentru ca a::$myvar nu este


definita
d) un warning pentru ca a::$myvar nu
este definita

b) 2
8. Ce face urmatorul segment de cod PHP?
<?php
require_once("clasamea.php");
clasamea::metodamea();

23

Modulul 4. POO in PHP


?>
a) cheama metoda metodamea din clasa
c) genereaza o eroare de sintaxa
in mod static
b) creaza si instantiaza clasamea si apoi
d)
cheama
functia
numita
cheama metoda metodamea
clasamea::metodamea()
9. Care din urmatoarele sunt folositoare la supraincarcare?
a) __call, __get, __set
c)__get,__set,__load
b) _get,_set,_load

d)__overload

10. Care din urmatoarele declaratii de variabile intr-o clasa este invalida in PHP5?
a) private $type = 'moderate';
c)public
$amnt
=
'500';
b) internal $term= 3;

d) protected $name = 'Quantas Private


Limited';

n acest capitol am studiat modul n care PHP implementeaz principalele


caracteristici ale program rii orientate pe obiect. Astfel, am discutat despre sintaxa
general a unei clase, despre func iile pe care o clas ar trebui s le aibe:
constructori, destructori, toString(), comparare, getter-i sau setter-i. PHP prin
faptul c nu asociaz n momentul declar rii unei variabile un tip, genereaz unele
particularit i, n special n ceea ce prive te constructorii i destructorii,
particularit i pe care le-am discutat pe parcursul acestui capitol. Mo tenirea i
problemele mo tenirii au fost discutate n urm toarele sec iuni. Modificatorii de
vizibilitate, modificatorul final sau clauza static au completat partea cu no iuni
de baz a capitolului. n continuare, func iile magice i comportamentul obiectelor,
atunci cnd sunt parametri de func ie, au adus n discu ie elemente avansate de
programare orientat pe obiect n PHP. Partea final a capitolului s-a referit la
clonarea obiectelor i compararea acestora.

24

Modulul 4. POO in PHP

Modulul 4. Programare Orientata pe Obiecte in PHP

Unitatea de nv are M4.U2. Exceptii


Cuprins:
M5.U1.1.
Introducere ........................................................................................................1
M5.U1.2.
Obiectivele unit ii de nv are ..........................................................................1
M5.U1.3.
Procesarea excep iilor ........................................................................................2
M5.U1.4.
Clasa Exception .................................................................................................3
M5.U1.5.
Excep ii derivate................................................................................................4
Excep ii predefinite PHP.....................................................................................................4
Excep ii definite de utilizator ..............................................................................................4
M5.U1.6.
Tratarea excep iilor n mod specific PHP ...........................................................5
Func ia set_exception_handler() .........................................................................................5
Erori tratate ca excep ii .......................................................................................................6
M5.U1.7.
Test de evaluare a cuno tin elor .........................................................................8
Introducere
M5.U1.1.
Excep iile sunt obiecte ce re in informa ie i care sunt transmise n afara
secven elor return. Excep iile sunt propagate napoi prin secven a de func ii
apelate pn cnd o anumit metod prinde excep ia. De fiecare dat cnd ntlnim
o excep ie ntr-o metod a programului avem posibilitatea de a recupera pierderile
cauzate de aceasta, iar execu ia se va ncheia f
a afi a mesajul standard de
eroare sau c derea sistemului. Prin tratarea excep iilor programul devine mult mai
prietenos cu utilizatorul.

M5.U1.2.
Obiectivele unit ii de nv are
Aceast unitate de nv are i propune ca obiectiv exceptiile in PHP. La sfr itul
acestei unit i de nv are studen ii vor parcurge urmatoarele subiecte:
Definirea excep iilor i rolul lor ntr-un program
Procesarea excep iilor
Clasa Exception
Excep ii derivate
Tratarea excep iilor n mod specific PHP
Obiecte i referin e
Clonarea obiectelor
Compararea obiectelo
Durata medie de parcurgere a unit ii de nv are este de 2 ore.

Modulul 4. POO in PHP


M5.U1.3.
Procesarea excep iilor
Un program PHP poate detecta erori, apoi poate indica sistemului de execu ie erorile ntlnite
i poate genera un cod de eroare sau poate l sa la latitudinea utilizatorului tratarea lor n mod
propriu.
Secven a de cod care ar putea genera o excep ie este inclus ntr-un bloc try. Fiecare bloc
try trebuie s fie urmat imediat de un bloc catch corespunz tor. A adar, un bloc try poate fi
urmat de unul sau mai multe blocuri catch fiecare tratnd clase diferite de excep ie.
n mod obi nuit, dac nu se ntlne te nicio excep ie, programul va continua cu instruc iunea
imediat urm toare ultimului bloc catch din secven a trycatch. Dac s-a ntlnit o
excep ie, blocul try nu va mai fi executat din locul n care s-a generat excep ia, iar execu ia
este preluat de primul bloc catch, care are ca parametru o instan ce se potrive te cu tipul
excep iei aruncate. Dac nu exist definit niciun bloc catch care s trateze excep ia atunci, n
mod predefinit, PHP va lansa o eroare fatal "Uncaught Exception ...". Din punct de
vedere sintactic avem urm toarea configura ie:
try{
//cod care prin execu ie poate arunca excep ii
}
catch(excep ie1){
//cod care trateaz excep ia dac tipul excep iei aruncate se
//potrive te cu tipul parametrului blocului
}

catch(excep ieN){
//cod care trateaz excep ia dac tipul excep iei aruncate se
//potrive te cu tipul parametrului blocului
}

unde, excep ie1, , excep ieN reprezint instan e ale clasei predefinite Exception sau ale
claselor derivate din aceasta (vezi paragraful dedicat excep iilor derivate).
Un bloc try poate con ine un alt bloc try, dar fiecare trebuie s ata eze
propriile blocuri catch.
Observatia 1.

O situa ie excep ie poate s apar n urma execu iei programului sau poate fi aruncat explicit
de c tre programator n momentul n care anumite condi ii sunt ndeplinite pentru a o genera.
n cel de-al doilea caz, PHP folose te instruc iunea throw. Dup ntlnirea instruc iunii throw
celelalte instruc iuni din secven a respectiv nu se mai execut , de aceea se recomand
folosirea ei ntr-o structur alternativ .
throw new Exceptie;
unde, Exceptie este constructorul clasei predefinite Exception sau al unei clase derivate din

aceasta.
La rndul s u i un bloc catch poate arunca o excep ie n mod predefinit sau
prin intermediul instruc iunii throw.
Observatia 2.

Modulul 4. POO in PHP


Exemplul 1. Procesarea excep iilor
<?php
function invers($x) {
if (!$x) {
throw new Exception('impartire la zero');
}
else return 1/$x;
}
try {
echo invers(5) . "<br>";
echo invers(0) . "<br>";
} catch (Exception $e) {
echo "<font color='red'>situatie excep ie: ",
>getMessage(), "!</font><br>";
}
echo 'instructiune dup excep ie';
?>

$e-

Apelul $e->getMessage() determin afi area mesajului aruncat de excep ie. Exemplul 1
reflect modul de a trata de c tre programator o situa ie care n mod obi nuit ar genera o
eroare ce ar fi tratat predefinit de PHP.
M5.U1.4.
Clasa Exception
Este clasa de baz din ierarhia claselor ce gestioneaz excep iile, att cele predefinite ct i
cele definite de utilizator. Atributele i modificatorii lor de vizibilitate precum i metodele de
acces la aceste atribute sunt prezentate n Tabelul 1.
Numele
atributului

Modificatorul
de vizibilitate
al atributului

Metoda de acces

$message

protected

getMessage()

$code

protected

getCode()

$file

protected

getFile()

$line

protected

getLine()

$trace

private

getTrace()
getTraceAsString()

Observa ii
returneaz un string cu
mesajul de excep ie
returneaza un ntreg cu
codul de excep ie
returneaz
numele
fi ierului de unde excep ia
a fost aruncat
returneaz num rul liniei
unde excep ia a fost
aruncat
returneaz
drumul
excep iei de cnd a fost
aruncat
i pn a fost
prins

Tabelul 1: Membrii clasei Exception


Observatia 3.

Toate metodele din Tabelul 1 sunt final;


Constructorul clasei are ca argument un string ce va ini ializa atributul $message.
Constructorul este public;
Clasele Exception i cele derivate din ea nu se pot clona;
Con ine metoda __toString(), care este public i care se poate redefini n clasele
derivate.

Modulul 4. POO in PHP

M5.U1.5.
Excep ii derivate
Clasa Exception este clasa de baz n ierarhia excep iilor ce pot fi aruncate i prinse n PHP.
Excep ii predefinite PHP
PHP furnizeaz i o colec ie de clase predefinite, derivate din Exception pe care le prezent m
n Tabelul 11.2.
Numele clasei

Numele clasei parinte

Observatii
excep
ie
aruncat
la un apel
BadFunctionCallException LogicException
al unei func ii nedefinite
excep ie aruncat la un apel
BadMethodCallException
BadFunctionCallException
al unei metode nedefinite
excep ie aruncat la un
DomainException
LogicException
domeniu nevalid
excep ie aruncat la un apel
de
func ie din cauza
InvalidArgumentException LogicException
nepotrivirii unui argument cu
cel a teptat
excep
ie aruncat de o
LengthException
LogicException
lungime nevalid
excep ie aruncat de o
LogicException
Exception
expresie logic nevalid
excep ie aruncat atunci cnd
OutOfBoundsException
RuntimeException
o valoare este o cheie
nevalid
excep ie aruncat atunci cnd
OutOfRangeException
LogicException
o valoare nu este ntr-un
domeniu
excep ie aruncat atunci cnd
OverflowException
RuntimeException
se doreste introducerea unei
valori ntr-un container plin
excep ie aruncat atunci cnd
RangeException
RuntimeException
o valoare nu corespunde unui
domeniu
excep ie aruncat n timpul
RuntimeException
Exception
rul rii
excep ie aruncat atunci cnd
UnderflowException
RuntimeException
se dore te extragerea unei
valori dintr-un container gol
excep ie aruncat atunci cnd
UnexpectedValueException RuntimeException
o valoare nu corespunde unei
mul imi date
Tabelul 2 : Clase predefinite, derivate din Exception

Toate aceste clase posed doar metodele pe care le-am amintit la clasa Exception. De
asemenea, toate observa iile de acolo r mn valabile.
Excep ii definite de utilizator
Utilizatorii pot defini propriile clase de excep ii prin extinderea clasei Exception.
4

Modulul 4. POO in PHP

Exemplul 2. Excep ii definite de utilizator


<?php
class ImpartireLaZero extends Exception{
public function __construct($message) {
parent::__construct($message);
}
public function __toString() {
return $this->message;
}
}
function invers($x) {
if (!$x) {
throw new ImpartireLaZero('impartire la zero');
}
else return 1/$x;
}
try {
echo invers(0) . "<br>";
} catch (ImpartireLaZero $e) {
echo "<font color='red'>situatie excep ie def de utilizator:
", $e, "!</font><br>";
}
?>

Am construit clasa ImpartireLaZero n care am redefinit constructorul i metoda


__toString(). n blocul try n loc s arunc m o excep ie oarecare arunc m excep ia ce
trateaz mp irea la zero, excep ie definit de utilizator. n plus, utilizatorul poate ad uga
metode noi clasei excep ie definit .
M5.U1.6.
Tratarea excep iilor n mod specific PHP
Tot ce am prezentat n acest capitol, pn n acest moment, se reg se te, cu unele diferen e
sintactice, i n alte limbaje de programare (C++, Java). PHP aduce ns i o tratare specific a
excep iilor pe baza unor construc ii pe care le vom discuta n continuare.
Func ia set_exception_handler()
Am afirmat n sec iunile anterioare c pentru a prinde o situa ie excep ie trebuie ca blocul de
cod ce arunc excep ia s fie introdus n try, iar apoi un alt bloc, catch, s trateze excep ia.
Aceast procedur poate avea ca alternativ folosirea func iei predefinite PHP
set_exception_handler(), cu urm toarea sintax :
set_exception_handler(nume)

unde, nume este o variabil ce con ine numele func iei ce trateaz excep ia, eventual clasa n
care se g seste aceast func ie (caz n care nume este un array. Vezi Exemplul 3).

Modulul 4. POO in PHP


Exemplul 3. Folosirea func iei set_exception_handler()
<?php
class ImpartireLaZero extends Exception{
public function __construct($message) {
parent::__construct($message);
}
public function __toString() {
return $this->message;
}
function tratare_excep ie(self $excep ie) {
echo "excep ie: " . $excep ie. "<br>";
}
}
set_exception_handler(array('ImpartireLaZero','tratare_excep
ie'));
function invers($x) {
if (!$x) {
throw new ImpartireLaZero('impartire la zero');
}
else return 1/$x;
}
echo invers(0) . "<br>";
?>

Fa

de clasa ImpartireLaZero, definit n Exemplul 2, am ad ugat o func ie utilizator,


tratare_excep ie(), care are un parametru de tipul clasei curente (self). n defini ia
func iei am afi at mesajul excep iei gra ie definirii metodei __toString(). Apelul func iei
set_exception_handler() se face prin parametrul de tip array, n care primul element este
numele clasei ce con ine metoda iar al doilea este numele metodei. Pe ultima linie ncerc m s
apel m func ia invers(), care arunc o excep ie. De i excep ia nu este aruncat ntr-un bloc
try i nu este prins de catch, totu i comportamentul este similar din cauza apelului din
set_exception_handler().
Observatia 4. Func ia set_exception_handler() se poate folosi i n cazul n care un
bloc try nu este urmat de un bloc catch care s trateze excep ia aruncat . n mod predefinit
PHP arunc o eroare.

Erori tratate ca excep ii


PHP posed un sistem propriu de tratare a erorilor. n locul acestuia, n anumite cazuri, putem
defini propria modalitate de tratare a erorilor. Astfel, mesajul de eroare generat mpreun cu
eventuala sistare a execu iei pot fi nlocuite cu o excep ie. Clasa predefinit pentru aceasta
este ErrorException. Pentru tratarea erorilor ca excep ii PHP folose te func ia
set_error_handler(), cu urm toarea sintax :
set_error_handler(nume)

unde, nume are aceea i semnifica ie ca n cazul lui set_exception_handler() (Exemplul 4).

Modulul 4. POO in PHP


Exemplul 4. Erori tratate ca excep ii
<?php
class ImpartireLaZero extends Exception{
public function __construct($message) {
parent::__construct($message);
}
public function __toString() {
return $this->message;
}
}
function tratare_erori($errno, $errstr, $errfile,
$errline){
throw new ErrorException($errstr, 0, $errno,
$errfile, $errline);
}
set_error_handler('tratare_erori');
function invers($x) {
if (!$x) {
throw new ImpartireLaZero('impartire la zero');
}
else return 1/$x;
}
try{
echo invers('a') . "<br>";
} catch (ImpartireLaZero $e) {
echo "<font color='red'>situatie excep ie def de
utilizator: ", $e, "!</font><br>";
}
catch (ErrorException $e1) {
echo "<font color='red'>situatie excep ie: ",
$e1->getMessage(), "!</font><br>";
}?>

Folosim clasa ImpartireLaZero definit n Exemplul 2. Func ia tratare_erori()


construie te clasa ErrorException. Apelul func iei set_error_handler() se face prin
numele func iei ce gestioneaz excep ia. n blocul try ncerc m un apel al func iei invers()
cu un parametru nepotrivit. Aceast excep ie nu poate fi prins cu ImpartireLaZero, ci doar
cu ErrorException.

ne reamintim...
Excep iile sunt folosite pentru a schimba controlul execu iei scriptului atunci cnd
are loc o eroare. In PHP 5 se introduce mecanismul excep iilor pentru gestionarea
erorilor modalitate obiect-orientat .
Cnd este lansat o excep ie codul ce urmeaz n bloc nu mai este executat i se
sare la blocul catch corespunz tor. Dac nu exist bloc catch corespunz tor va fi
lansat o eroare fatal cu mesajul: "Uncaught Exception.

Modulul 4. POO in PHP


n blocul try se pune codul care poate lansa excep ii, throw se folose te pentru a
lansa excep ia. Blocul catch este locul unde se intercepteaz excep ia.
nlocui i zona punctat cu termenii corespunz tori.
1. Incepand cu PHP5 avem la dispozitie un mecanism de . pe care il
putem gasi si in alte limbaje, mecanism cunoscut sub numele . Este
foarte util acest mecanism pentru ca nu avem nevoie de afisarea si
pentru ca ne ofera posibilitatea de a face mult mai transparente serviciile
oferite.
2. Pentru debugging, clasa .. ne poate oferi mai multe detalii prin
metodele puse la dispozitie. Metoda .. () ne afiseaza doar mesajul cu
care a fost "aruncata" exceptia. Daca ne intereseaza linia la care a fost
declansat mecanismul de tratare putem apela metoda . (). De
asemenea exista si metodele () pentru codul exceptiei, .. ()
pentru numele fisierului in care s-a declansat mecanismul. E important de
stiut ca aceste metode sunt , adica nu pot fi extinse. Pe langa aceste
metode mai exista si metoda __......... () care ne returneaza un sir lung in
care expresia e explicata detaliat.

M5.U1.7.
Test de evaluare a cuno tin elor
Marca i varianta corect .
1.Ce output va produce urmatorul script ?
<?php
function checkNum($number) {
if($number>1) {
throw new Exception("Valoare trebuie sa fie mai mica ");
}
return true;
}
try {
checkNum(2);
echo Numarul e OK';
}
catch(Exception $e) {
echo 'Message: ' .$e->getMessage();
}
?>
a) 2
c) Message:Valoare trebuie sa fie mai
mica
b) Numarul e OK
d) Nici un output
2. Ce output va produce urmatorul script?
<?php
function checkNum($number)
{
if($number>1)

Modulul 4. POO in PHP


{
throw new Exception("Valoarea trebuie sa fie mai mica");
}
return true;
}
checkNum(2);
?>
a) 2
b) Valoarea trebuie sa fie mai mica

c) Nici un output
d) Va afisa o eroare

3. Ce output va produce urmatorul script, considerand ca fisierul test.txt exista?


<?php
try{
$fp = fopen('test.txt','r');
if( !$fp ){
throw new Exception("Nu am putut deschide fisierul pentru citire");
}
}catch( Exception $e ){
echo "Exceptie: ".$e->getMessage();
}
?>
a) Nici un output daca fisierul poate fi
deschis

c) Exceptie: Nu am putut deschide


fisierul pentru citire

b) Se va afisa o eroare
d) Nici un raspuns de mai sus.
4. Daca nu exista definit nici un bloc catch care sa trateze o exceptie atunci, in mod predefinit,
PHP .:
a) Nu va face nimic
c) lansa o eroare fatal "Uncaught
Exception ..."

b) Va trece mai departe la urmatoarea


secventa de cod
5. Utilizatorii pot defini propriile clase de excep
a) Nu se pot defini alte exceptii in afara
celor definite deja in PHP5
b) extinderea clasei Exception

d) Nici un raspuns de mai sus


ii prin...
c) crearea unei clase Exception2
d) Nici un raspuns de mai sus

Modulul 4. POO in PHP


n aceasta unitate de invatare am discutat problemele esen iale ale conceptului de
excep ie, tratarea exceptiilor i implement ri specifice PHP ale exceptiilor. Astfel,
am discutat despre membrii clasei Exception care controleaz activitatea de baz
n manipularea exceptiilor. Am discutat apoi despre blocurile implicate n
aruncarea, respectiv prinderea excep iilor. Am derivat, mai departe, clasa de baz i
am studiat principalele clase predefinite, precum i am creat clase utilizator pentru
tratarea excep iilor. n final, am tratat erorile cu ajutorul excep iilor.

10

Modulul 5. Persistenta datelor cu PHP

Modulul 5. Persistenta datelor cu PHP

Unitatea de nv are M5.U1. Persistenta datelor cu PHP


Cuprins:
M5.U1.1.
Introducere ........................................................................................................1
M5.U1.2.
Obiectivele unit ii de nv are ..........................................................................2
M5.U1.3.
Conectarea la server-ul MySQL ........................................................................2
M5.U1.4.
Selectarea unei baze de date ..............................................................................3
M5.U1.5.
Detectarea erorilor .............................................................................................3
M5.U1.6.
Opera ii fundamentale asupra unei baze de date.................................................4
Expedierea unei cereri catre MySQL ..................................................................................4
Num rul de rnduri afectate de o cerere ..............................................................................6
Ob inerea valorii unui cmp care se autoincrementeaz ......................................................6
Interog ri ale bazei de date .................................................................................................7
M5.U1.7.
Accesarea unui ResultSet ..................................................................................7
Num rul de rnduri al rezultatului unei interog ri ...............................................................8
Parcurgerea unui ResultSet .................................................................................................8
Pozi ionarea indicatorului de tabel .................................................................................... 10
Num rul de coloane al rezultatului unei interog ri ............................................................ 10
Numele cmpurilor unei interog ri....................................................................................10
Lungimea unui cmp din tabela rezultat al unei interog ri.................................................11
Tipul unui cmp din tabela rezultat al unei interog ri ........................................................ 11
Atributele unui cmp din tabela rezultat al unei interog ri.................................................11
M5.U1.8.
Informa ii despre baza de date ......................................................................... 12
Listarea bazelor de date ....................................................................................................12
Listarea tabelelor dintr-o baz de date ............................................................................... 13
M5.U1.9.
Test de evaluare a cuno tin elor .......................................................................14
M5.U1.1. Introducere
Prin persisten a datelor ntelegem p strarea datelor un timp mai ndelungat, mai
precis i dup terminarea rul rii unui script. Exist mai multe posibilit i de
realizare a persistentei. Unele le-am studiat n capitolele precedente: cookie-urile
strau date n cantit i mici, un interval determinat de timp, sau fi ierele externe
unde datele erau recunoscute n mod text sau binar. Pentru un volum mai mare de
date i pentru a crea un mod organizat de gestiune a lor, frecvent se folosesc bazele
de date. Exist multiple sisteme de gestiune a bazelor de date. Vom studia n acest
capitol bazele de date rela ionale i un sistem de gestiune foarte mult utilizat
mpreun cu PHP, i anume MySQL.
MySQL (My Structured Query Language) ruleaz ca un server de baze de date
multiuser. Este scris n C i C++ de c tre Michael Widenius i David Axmark, iar
prima versiune a ap rut n 1995. MySQL este open-source, free i cross-platform,
adic ruleaz f modific ri pe diferite platforme cum ar fi: Windows, Linux, Mac
OS X, Solaris sau SunOS.

Modulul 5. Persistenta datelor cu PHP

a dup cum am precizat nc din Introducere, prin instalarea pachetului


XAMPP avem instalat i serverul MySQL, cu toate conexiunile de comunicare
cute la serverul Apache. Versiunea la care vom face referire n acest capitol este
MySQL 5.0.59a.
XAMPP

ofer

un

browser

de

baze

de

date

la

adresa:

http://localhost/phpmyadmin/.

Vom considera c cititorul acestui capitol are cuno tin ele necesare despre baze de
date rela ionale i despre MySQL, ca sistem de gestiune a bazelor de datelor. n
sec iunile urm toare vom detalia doar implementarea n PHP a comenzilor
MySQL i vom comenta acolo unde sunt necesare clarific rile teoretice.
Pentru o aplica ie care interac ioneaz cu un server de baze de date trebuie s
parcurgem mai nti unele etape preg titoare, i anume: conectarea la server i
selectarea bazei de date, iar apoi etape specifice aplica iei: crearea, interogarea sau
administrarea bazei de date, etapa de sfr it fiind nchiderea conexiunii.

M5.U1.2. Obiectivele unit ii de nv are


Aceast unitate de nv are i propune ca obiectiv principal lucrul cu sesiuni in
PHP. La sfr itul acestei unit i de nv are studen ii vor parcurge urmatoarele
subiecte:
Introducere n conceptul de persisten a datelor i modul de realizare a
persisten ei cu MySQL
Conectarea la server-ul MySQL
Erori n lucrul cu server-ul MySQL
Opera ii fundamentale asupra unei baze de date
Accesarea rezultatelor unei interog ri
Informa ii despre baza de date
Durata medie de parcurgere a unit ii de nv are este de 2 ore.

M5.U1.3. Conectarea la server-ul MySQL


Pentru a ne conecta la server-ul de baze de date, PHP ne ofer func ia mysql_connect().
Sintaxa simplificat a acestei func ii este:
mysql_connect(server, utilizator, parola)

unde:
server este numele sever-ului sau IP-ul acestuia urmat de num rul portului. n mod
obi nuit portul este 3306. Dac MySQL se afl pe acela i calculator cu server-ul
Apache atunci server va avea valoarea: localhost:3306 sau 127.0.0.1:3306.
Aceasta este i valoarea predefinit . Putem modifica valoarea predefinit n php.ini
prin directiva mysql.default_host.

Modulul 5. Persistenta datelor cu PHP


utilizator este numele utilizatorului cu care ne putem conecta la server-ul MySQL.

Utilizatorul poate avea diverse drepturi asupra bazelor de date de pe server a a cum au
fost create de administratorul server-ului. n momentul instal rii pachetului XAMPP
se creaz n mod implicit un utilizator cu drepturi depline, inclusiv de creare de conturi
de utilizatori, avnd valoarea root. Este recomandat ca aceast valoare s fie
schimbat dup instalare. Valoarea predefinit poate fi modificat n php.ini prin
directiva mysql.default_user.
Parola este parola de logare a utilizatorului, creat de administratorul bazei de date. La
instalarea XAMPP valoarea parolei este stringul vid. Valoarea predefinit poate fi
modificat n php.ini prin directiva mysql.default_password.
Returneaz o conexiune la baza de date sau FALSE n caz de e ec.
Putem suprima mesajul de eroare, n caz de conexiune gre it , prin folosirea
operatorului @.
Observatia 1.

n mod implicit conexiunea anterior creat se nchide la terminarea scriptului ce a deschis-o.


Explicit putem nchide conexiunea apelnd func ia mysql_close(), ce are urm toarea sintax
general :
mysql_close(conexiune)

unde, conexiune este numele unei conexiuni create cu mysql_connect(). Dac conexiune
lipse te, se va nchide ultima conexiune deschis , iar dac nu este nicio conexiune deschis se
va genera un mesaj de eroare.
M5.U1.4. Selectarea unei baze de date
Dup ce conexiunea a fost creat cu succes putem deschide o baz de date. Selectarea bazei
de date se face folosind func ia mysql_select_db(), cu urm toarea sintax general :
mysql_select_db(nume_baza, conexiune)

unde:
nume_baza este numele bazei de date ce urmeaz a fi selectat ;
conexiune este numele unei conexiuni deschise cu mysql_connect(). Dac
parametrul conexiune lipse te se va ncerca selectarea bazei de date din ultima

conexiune deschis .
Func ia va returna TRUE n cazul n care selec ia a putut fi f cut

i FALSE, altfel.

M5.U1.5. Detectarea erorilor


Erorile transmise de MySQL pot fi prinse de PHP prin intermediul a dou
mysql_errno() i mysql_error(). Sintaxa general este:

func ii:

mysql_errno(conexiune)

returneaz num rul erorii ultimei opera ii MySQL. Num rul erorii este n coresponden
un string returnat de func ia:
mysql_error(conexiune)

cu

Modulul 5. Persistenta datelor cu PHP

Dac parametrul conexiune lipse te se va face referire la ultima conexiune deschis .


Exemplul 1. Deschiderea unei conexiuni i selectarea unei baze de date
<html>
<head>
<title>
Exemplul 1
</title>
</head>
<body>
<?php
$user
$pass
$bd =
$link

= "root";
= "";
"test";
= @ mysql_connect( "localhost", $user, $pass )

or
die( "Nu m-am putut conecta la MySQL!
".mysql_errno());;
print "Conectare la server cu succes!";
@ mysql_select_db( $bd ) or
die ( "Nu m-am putut conecta la baza de date
$db: ".mysql_error());
print "Baza de date $bd selectata cu succes!";
mysql_close( $link );
?>
</body>
</html>

M5.U1.6. Opera ii fundamentale asupra unei baze de date


Dup ce conexiunea a fost realizat cu succes, iar baza de date selectat , putem s facem
opera ii asupra bazei de date.
Expedierea unei cereri catre MySQL
Poate cea mai utilizat func ie n lucru cu baze de date aflate pe un server este
mysql_query() ce expediaz server-ului o cerere i are urm toarea sintax :
mysql_query(cerere, conexiune)

unde, cerere este un string ce con ine o fraz SQL. Parametrul conexiune poate lipsi i
atunci este invocat ultima conexiune. Corectitudinea sintactic a cererii nu este verificat
nainte de expediere. MySQL va returna o eroare n cazul n care cererea are erori de sintax .
Func ia returneaz un rezultat ce urmeaz apoi a fi interpretat dac cererea este de tipul
SELECT, SHOW, DESCRIBE, etc. sau returneaz TRUE dac cererea este de tipul INSERT, UPDATE,
DELETE, DROP, etc. n caz de succes, respectiv FALSE n caz de e ec.
Dac dorim s cre m o baz de date goal , librarie, putem folosi urm torul cod:
$sql = "CREATE DATABASE librarie";
if (mysql_query($sql, $link))
echo "Baza de date librarie a fost creat cu succes\n";
else
echo "Eroare la crearea bazei de date: ".mysql_error()."\n";

Modulul 5. Persistenta datelor cu PHP

unde, $sql con ine string-ul interog rii SQL, iar $link este conexiunea creat
Exemplul 1.

n baza de date anterior creat vom crea acum tabele. Exemplific m crearea de tabele prin
tabela domenii ce are urm toarea structur :
id_domeniu: cheie primara, INTEGER, NOT NULL, AUTO_INCREMENT;
nume_domeniu: VARCHAR( 20 );
descriere: TEXT;
codul PHP pentru a crea aceast structur este:
$sql = "create table `librarie`.`domenii` ( `domenii` int NOT NULL
AUTO_INCREMENT , `nume_domeniu` varchar (20) , `descriere` text , PRIMARY
KEY (`domenii`)) ";
if (mysql_query($sql, $link))
echo "Baza de date my_db a fost creat cu succes\n";
else
echo "Eroare la crearea bazei de date: ".mysql_error()."\n";

Acesta este modul programat de a crea o tabel . Putem crea tabele utiliznd i browser-ul
bazei de date.
n continuare ad ug m date n tabela domenii. Vom folosi un formular cu dou cmpuri
corespunz toare numelui, respectiv descrierii domeniului. C mpul id_domeniu se
autoincrementeaz la fiecare ad ugare de noi nregistr ri.
Exemplul 2. Ad ugarea de date dintr-un formular ntr-o tabel
<html>
<head>
<title>
Exemplul 2
</title>
</head>
<body>
<?php
if ( isset( $_POST['nume_domeniu']) && isset(
$_POST['descriere'] )){
$nume_domeniu=$_POST['nume_domeniu'];
$descriere=$_POST['descriere'];
$dberror = "";
$ret = adauga_n_bd( $nume_domeniu, $descriere,
$dberror );
if ( ! $ret )
print "Error: $dberror<BR>";
else
print "Va multumim";
}
else {
write_form();
}
function adauga_n_bd( $nume_domeniu, $descriere,
&$dberror ){
$user = "root";

Modulul 5. Persistenta datelor cu PHP


$pass = "";
$db = "librarie";
$link = mysql_pconnect( "localhost", $user, $pass );
if ( ! $link ){
$dberror = "Nu m-am putut conecta la server-ul
MySQL!";
return false;
}
if ( ! mysql_select_db( $db, $link ) ){
$dberror = mysql_error();
return false;
}
$query = "INSERT INTO domenii ( nume_domeniu,
descriere) values( '$nume_domeniu', '$descriere')";
if ( ! mysql_query( $query, $link ) ){
$dberror = mysql_error();
return false;
}
return true;
}
function write_form(){
global $PHP_SELF;
print "<form action=\"$PHP_SELF\"
method=\"POST\">\n";
print "<input type=\"text\" name=\"nume_domeniu\">
";
print "Domeniul dorit<p>\n";
print "<input TYPE=\"text\" name=\"descriere\"> ";
print "Descrierea domeniului<p>\n";
print "<input type=\"submit\"
value=\"submit!\">\n</form>\n";
}
?>
</body>
</html>

Num rul de rnduri afectate de o cerere


Putem afla num rul de rnduri afectate n urma opera iei INSERT din Exemplul 2 folosind
func ia mysql_affected_rows() ce are urm toarea sintax general :
mysql_affected_rows(conexiune)

unde, conexiune este op ional , dac lipse te se va considera ultima conexiune creat .
Rezultatul ntors este num rul rndurilor afectate de ultimul apel al func iei mysql_query()
cu parametru INSERT, UPDATE sau DELETE n caz de succes i -1 n caz de e ec. Dac
parametrul este REPLACE, atunci, n caz de success, se va ntoarce suma dintre num rul
nregistr rilor eliminate i num rul nregistr rilor ad ugate.
Ob inerea valorii unui cmp care se autoincrementeaz
n Exemplul 2 am ad ugat nregistr ri noi n tabela domenii f
s specific m explicit valori
pentru atributul id_domeniu. Aceasta deoarece valoarea sa se autoincrementeaz . Putem afla
valoarea acestui atribut, pentru ultima nregistare introdus cu INSERT, folosind func ia
mysql_insert_id(), ce are urm toarea sintax general :

Modulul 5. Persistenta datelor cu PHP


mysql_insert_id(conexiune)

unde, conexiune poate s lipseasc i atunci se folose te ultima conexiune creat . Func ia
ntoarce valoarea cmpului autoincrementat al ultimei nregistr ri introduse cu INSERT n caz
de succes, 0 dac ultima nregistrare nu con ine un cmp autoincrementat, sau FALSE dac nu
avem nicio conexiune stabilit , n caz de e ec.
Observatia 2. Tipul returnat este integer n PHP. Dac n MySQL tipul cmpului
autoincrementat este BIGINT, atunci rezultatul returnat nu este corect. Se poate folosi n
schimb o cerere SQL n care s apel m func ia LAST_INSERT_ID().

Pentru a ilustra cu exemple func iile din sec iunile urm toare vom completa baza de date
libr rie cu urm toarele tabele:
carti, care con ine c ile accesibile cump torilor din libr rie. Am presupus c o
carte apar ine unui singur domeniu. Aceast tabel are urm toarea structur :
o id_carte: cheie primar , INTEGER, NOT NULL, AUTO_INCREMENT;
o titlu: VARCHAR( 20 );
o pret: FLOAT;
o id_domeniu: cheie str in , INTEGER;
autori, autorii c ilor i are urm toarea structur :
o id_autor: cheie primar , INTEGER, NOT NULL, AUTO_INCREMENT;
o nume: VARCHAR(20);
o prenume: VARCHAR(20);
carti_autori, tabel de legatur dintre tabelul carti i tabelul autori; o nregistrare
din acest tabel leag o carte de un autor. O carte poate avea mai mul i autori, deci pot
ap rea mai multe nregistr ri cu acela i id_carte. Un autor poate scrie mai multe
i, deci pot ap rea mai multe nregistr ri ce au acela i id_autor. Aceast tabel are
urm toarea structur :
o id_carte: cheie str in , INTEGER;
o id_autor: cheie str in , INTEGER;

Interog ri ale bazei de date


Pn n acest moment func ia mysql_query() con inea ca prim parametru o clauz SQL care
nu returna, ca rezultat, un tabel. Dac clauza SQL este ns un SELECT atunci rezultatul
apelului este un tabel, cunoscut i sub numele de ResultSet.
Exemplul 3. Dac dorim s afl m toate inform iile despre domeniile n care pot fi incluse
ile din libr rie putem folosi urm toarea sintax :
$rezultat = mysql_query( "SELECT * FROM domains" );

Rezultatul returnat de func ie este re inut n variabila $rezultat i este practic un tabel, n
caz de succes, tabel ce va fi apoi parcurs cu func ii PHP.
M5.U1.7. Accesarea unui ResultSet

Modulul 5. Persistenta datelor cu PHP


Num rul de rnduri al rezultatului unei interog ri
Putem afla num rul de rnduri din variabila $rezultat din Exemplul 3 utiliznd func ia
mysql_num_rows(). Func ia are urm toarea sintax general :
mysql_num_rows(rezultat)
unde, rezultat este o variabil ce are valoarea rezultatului ntors de mysql_query() cu
parametru SELECT sau SHOW.

Func ia returneaz num rul de rnduri n caz de succes i FALSE altfel.


Parcurgerea unui ResultSet
PHP pune la dispozi ie mai multe posibilit i de parcurgere a unui rezulat ntors de o
interogare SQL. Vom prezenta n continuare cteva dintre cele mai frecvent ntrebuin ate.
Func ia mysql_fetch_row() returneaz o variabil de tip array pentru rndul curent din
tabela rezultat. Dup ncheierea execu iei func iei, indicatorul de tabel nainteaz la urm torul
rnd, dac exist , sau la sfr itul tabelei altfel. Sintaxa general este:
mysql_fetch_row(rezultat)

unde, rezultat este o variabil ce are valoarea rezultatului ntors de mysql_query() cu


parametru SELECT sau SHOW.
Exemplul 4.
se afi eze titlul i pre ul unitar al c
Eminescu.

ilor care l au ca autor pe Mihai

<html>
<head>
<title>
Exemplul 4
</title>
</head>
<body>
<?php
$user = "root";
$pass = "";
$db = "librarie";
$conexiune = mysql_connect( "localhost", $user,
$pass );
if ( ! $conexiune ) die( "Nu putem conecta server-ul
MySQL" );
mysql_select_db( $db, $conexiune ) or die ( "Nu
putem deschide $db: ".mysql_error() );
$rezultat = mysql_query( "SELECT titlu, pret FROM
carti, autori, carti_autori WHERE
carti.id_carte=carti_autori.id_carte and
carti_autori.id_autor=autori.id_autor and nume='Eminescu' and
prenume='Mihai'" );
$nr_linii = mysql_num_rows( $rezultat );
print "Tabela rezultat are $nr_linii linii<P>";
print "<table border=1>\n";

Modulul 5. Persistenta datelor cu PHP


while ( $linie = mysql_fetch_row( $rezultat ) ){
print "<tr>\n";
foreach ( $linie as $camp )
print "\t<td>$camp</td>\n";
print "</tr>\n";
}
print "</table>\n";
mysql_close( $conexiune );
?>
</body>
</html>

n Exemplul 4, pe lng deschiderile obi nuite, de conexiune i baz de date, am realizat o


interogare prin care am jonc ionat trei dintre tabelele bazei de date: carti, autori i
carti_autori. n plus, condi ia de selec ie mai adaug o condi ie de egalitate compus
asupra numelui i prenumelui. Variabilei $linie i-am dat valoarea returnat de func ia
mysql_fetch_row(). Am parcurs apoi aceast variabil ca pe un array prin instruc iunea
foreach i am afi at valoarea fiec rui element al s u. Elementele array-ului sunt indexate
predefinit.
Alternativ, putem folosi func ia mysql_fetch_array() ce returneaz tot un array dar, ale
rui elemente pot fi accesate i prin cheia asociat numelui coloanei. Sintaxa simplificat
este:
mysql_fetch_array(rezultat)

unde, rezultat este o variabil ce are valoarea rezultatului ntors de mysql_query() cu


parametru SELECT sau SHOW.
Exemplul 4 poate fi modificat pentru a folosi aceast func ie:
print "<TABLE BORDER=1>\n";
while ( $linie = mysql_fetch_array( $rezultat ) ){
print "<TR>\n";
print "<TD>$linie[titlu]</TD><TD>$linie[pret]</TD>\n";
print "</TR>\n";
}
print "</TABLE>\n";

O alt variant de parcurgere este dat de folosirea func iei mysql_fetch_object(). Aceast
func ie returneaz , n caz de success, un obiect pentru fiecare rnd al rezultatului. Atributele
obiectului sunt cmpurile tabelei. Sintaxa general a acestei func ii este:
mysql_fetch_object(rezultat, nume_clasa, parametri_constructor)

unde, rezultat este o variabil ce are valoarea rezultatului ntors de mysql_query() cu


parametru SELECT sau SHOW, nume_clasa este numele clasei din care se va construi instan a
ce gestioneaz atributele liniei curente, iar parametri_constructor reprezint un array n
care sunt parametrii necesari apel rii constructorului clasei nume_clasa. Ultimii doi
parametri pot lipsi i atunci obiectul construit este instan a clasei predefinite stdClass.
Exemplul 4 poate fi modificat pentru a folosi aceast func ie:

Modulul 5. Persistenta datelor cu PHP

print "<table border=1>\n";


while ( $linie = mysql_fetch_object( $rezultat ) ){
print "<tr>\n";
print "<td>$linie->titlu</td><td>$linie->pret</td>\n";
print "</tr>\n";
}
print "</table>\n";

Pozi ionarea indicatorului de tabel


a dup cum am v zut din exemplele anterioare, indicatorul tabelei este pozi ionat pe prima
linie dup deschiderea conexiunii i avanseaz cte o linie dup apelul oric reia dintre
func iile: mysql_fetch_rows(), mysql_fetch_array() sau mysql_fetch_object(). Putem
modifica acest comportament secven ial apel nd func ia mysql_data_seek(). Sintaxa
general a acestei func ii este:
mysql_data_seek(rezultat, numar)

unde:
rezultat este o variabil ce are valoarea rezultatului ntors de mysql_query() cu
parametru SELECT sau SHOW;
numar indic num rul liniei la care se dore te pozi ionarea indicatorului de tabel.
Liniile unui tabel rezultat sunt numerotate ntre 0 i mysql_num_rows()-1.

Func ia returneaz TRUE n caz de succes i FALSE altfel.


Num rul de coloane al rezultatului unei interog ri
Putem afla num rul de coloane ale fiec rei nregistr ri din variabila $rezultat din Exemplul 3
func ia mysql_num_fields(). Func ia are urm toarea sintax general :
mysql_num_fields(rezultat)

unde, rezultat este o variabil ce are valoarea rezultatului ntors de mysql_query() cu


parametru SELECT sau SHOW.
Func ia returneaz num rul de coloane n caz de succes i FALSE altfel.
Numele cmpurilor unei interog ri
Func ia mysql_field_name() returneaz numele unei coloane din tabela rezultat n caz de
succes i FALSE altfel. Sintaxa general a acestei func ii este:
mysql_field_name(rezultat, numar)

unde:
rezultat este o variabil ce are valoarea rezultatului ntors de mysql_query() cu
parametru SELECT sau SHOW
numar indic num rul coloanei din cadrul rndului curent la care se dore te aflarea

numelui.
Coloanele unei linii din tabelul rezultat sunt numerotate ntre 0 i mysql_num_fields()-1.

10

Modulul 5. Persistenta datelor cu PHP


Putem modifica Exemplul 4 astfel nct tabelul ce cuprinde datele din tabela rezultat s aib
cap de tabel n care s indic m numele cmpurilor afi ate:

print "<tr>\n";
for ( $x=0; $x<$num_fields; $x++ )
print "<th>".mysql_field_name( $rezultat, $x ) ."</th>";
print "</tr>\n";
while ( $linie = mysql_fetch_object( $rezultat ) ){
print "<tr>\n";
print "<td>$linie->titlu</td><td>$linie->pret</td>\n";
print "</tr>\n";
}
print "</table>\n";

Lungimea unui cmp din tabela rezultat al unei interog ri


Putem afla lungimea unui cmp apel nd func ia mysql_field_len(), ce are urm toarea
sintax general :
mysql_field_len(rezultat, numar)

unde:
rezultat este o variabil ce are valoarea rezultatului ntors de mysql_query() cu
parametru SELECT sau SHOW;
numar indic numarul coloanei din cadrul rndului curent la care se dore te aflarea
lungimii. Coloanele unei linii din tabelul rezultat sunt numerotate ntre 0 i
mysql_num_fields()-1.

Tipul unui cmp din tabela rezultat al unei interog ri


Putem afla tipul PHP al unui cmp apelnd func ia mysql_field_type(), ce are urm toarea
sintax general :
mysql_field_type(rezultat, numar)

unde:
rezultat este o variabil ce are valoarea rezultatului ntors de mysql_query() cu
parametru SELECT sau SHOW
numar indic num rul coloanei din cadrul rndului curent la care se dore te aflarea
tipului. Coloanele unei linii din tabelul rezultat sunt numerotate ntre 0 i
mysql_num_fields()-1.

Atributele unui cmp din tabela rezultat al unei interog ri


Putem afla atribute ca: not_null, primary_key, unique_key, multiple_key, blob,
unsigned, zerofill, binary, enum, auto_increment i timestamp ale unui cmp apelnd
func ia mysql_field_flags() ce are urm toarea sintax general :
mysql_field_flags(rezultat, numar)

unde:
rezultat este o variabil ce are valoarea rezultatului ntors de mysql_query() cu
parametru SELECT sau SHOW;

11

Modulul 5. Persistenta datelor cu PHP


numar indic num rul coloanei din cadrul rndului curent la care se dore te aflarea
atributelor. Coloanele unei linii din tabelul rezultat sunt numerotate ntre 0 i
mysql_num_fields()-1.

Rezultatul returnat este un string, n care atributele sunt separate prin spa iu, care poate fi
desp it utiliznd func ia explode().
M5.U1.8. Informa ii despre baza de date
PHP con ine un domeniu vast de func ii ce permit returnarea informa iilor despre structura
conexiunii curente.
Listarea bazelor de date
Func ia mysql_list_dbs() returneaz o tabel ce con ine lista bazelor de date disponibile
din conexiune, n caz de succes i FALSE altfel. Sintaxa general este:
mysql_list_dbs(conexiune)

unde, conexiune poate s lipseasc

i atunci se folose te ultima conexiune creat .

Folosim func ia mysql_num_rows() pentru a afla num rul de baze de date accesibile din
conexiune. Apoi, pentru aflarea numelui acestora apel m func ia mysql_db_name() ce are
urm toarea sintax simplificat :
mysql_db_name(rezultat, numar)

unde:
rezultat este o variabil ce are valoarea rezultatului ntors de mysql_list_dbs()
numar indic num rul liniei la care se dore te pozi ionarea indicatorului de tabel.
Liniile unui tabel rezultat sunt numerotate ntre 0 i mysql_num_rows()-1. Func ia
returneaz un string cu numele n caz de succes i FALSE altfel.
Exemplul 5. Lista bazelor de date disponibile din conexiunea curent
<html>
<head>
<title>Exemplul 5</title>
</head>
<body>
<?php
$user = "root";
$pass = "";
$conexiune = mysql_connect( "localhost", $user,
$pass );
if ( ! $conexiune ) die( "nu ne putem conecta la
server-ul MySQL" );
$rezultat = mysql_list_dbs( $conexiune );
$num = mysql_num_rows( $rezultat );
for( $x = 0; $x < $num; $x++ )
print mysql_db_name( $rezultat, $x )."<br>";
mysql_close( $conexiune );
?>
</body>
</html>

12

Modulul 5. Persistenta datelor cu PHP

Listarea tabelelor dintr-o baz de date


Putem folosi func ia mysql_query() avnd ca parametru o interogare SHOW i apoi parcurgem
tabela rezultat prin mecanisme deja cunoscute.
Modific m Exemplul 5 pentru a afi a pentru fiecare baz de date i numele tabelelor ce o
formeaz .
$rezultat = mysql_list_dbs( $conexiune );
$num = mysql_num_rows( $rezultat );
for( $x = 0; $x < $num; $x++ ){
$bd=mysql_db_name( $rezultat, $x );
print "<b>".$bd."</b> con ine urmatoarele tabele:<br>";
$sql = "SHOW TABLES FROM $bd ";
$rezultat1 = mysql_query($sql);
print "<ul>";
while ($linie = mysql_fetch_row($rezultat1)) {
print "<li> {$linie[0]}";
}
print "</ul>";
}

ne reamintim...
MySQL reprezinta o baza de date relationala oferita gratuit, disponibila atat pentru
Windows, cat si pentru Linux. Este folosita in realizarea aplicatiilor mici si medii.
Ideea pe care se bazeaza interactiunea PHP - MySQL sau in general
interactiunea dintre PHP si o baza de date este aceea ca permite ca informatiile care
se doresc sa apara pe site sa fie prezente in baza de date. In acest fel informatiile
pot fi actualizate usor si prezentate intr-o forma "dinamica" in cadrul site-ului.
Operatiile cele mai importante effectuate cu o baza de date in PHP prezentate
sunt:
Crearea unei baze de date si introducerea datelor in tabele, deschiderea/inchiderea
bazelor de date, vizualizarea, copierea si modificarea structurii unei baze de date,
stergerea inregistrarilor dintr-o baza de date.
nlocui i zona punctat cu termenii corespunz tori.
1. Cea mai elementara forma de interogare este comanda ".. " simpla.
Cea mai simpla interogare raporteaza toate coloanele din toate rndurile unui
tabel. Interogarea are urmatoarea forma:
.. * tabel;
- Unde "tabel" este numele tabelului la care se va obtine accesul.
2. Inainte de a putea accesa informatii din baza de date , trebuie creata o
cu serverul MySQL.
Pentru a va .. la un server MySQL cu PHP si MySQL, se creaza o de
obiect mysql, cu formula , la care se adauga datele de conectare.
3. Conexiunea va fi inchisa cand scriptul se termina. Se recomanda totusi sa
inchideti conexiunea mai devreme, cand nu o mai foloseste. Acest lucru va
elibera folosita de conexiune. Pentru a inchide o conexiune se foloseste
metoda . () din clasa MySQL
4. Pentru a inregistrari noi intr-un tabel MySQL, se foloseste
comanda INSERT. .
13

Modulul 5. Persistenta datelor cu PHP


Exista doua metode prin care o interogare INSERT poate fi scrisa:
- Prima metoda nu specifica .. coloanelor unde datele for fi introduse, ci doar
.. lor.
- Pentru a doua metoda se specifica atat .. coloanei /coloanelor cat si valorile
care vor fi intoduse:.

M5.U1.9. Test de evaluare a cuno tin elor


Marca i varianta corect .
1.Considerand urmatorul statement SQL, care din urmatoarele ar fi idei bune pentru a limita
cantitatea de date returnata?(Alegeti doua raspunsuri)
SELECT * FROM MY_TABLE
a) Daca e posibil, convertiti codul intr-o
c) Daca e posibil, adaugati o clauza
procedura stocata
WHERE
d) Daca e suportat de DBMS,
b) Daca e posibil, in aplicatie, reduceti
convertiti query-ul intr-un view.
numarul de campuri returnate de query
prin
specificarea
fiecarui
camp
individual ca part din query
2. La ce foloseste cuvantul cheie DESC in urmatorul query?
SELECT *
FROM MY_TABLE
WHERE ID > 0
ORDER BY ID, NAME DESC

a) Face ca setul returnat de query sa fie


sortat in mod descrescator

c) Face ca celulele cu acelasi ID sa fie


sortate dupa NAME in ordine
descrescatoare
d) Face ca celulele sa fie sortate dupa
NAME mai intai si apoi dupa ID

b) Face ca celulele cu acelasi ID sa fie


sortate dupa NAME in ordine
crescatoare
3. Functia mysql_connect() nu primeste urmatorul parametru:
a) host baza de date
c) parola

b) user ID
d) numele bazei de date
4. Studiati urmatorii pasi si determinate ordinea corecta:
1. Deschiderea unei conexiuni la MySQL server
2. Executarea unui query SQL
3. Obtinerea datelor dintr-un query
4. Selectarea unei baze de date
5. Inchiderea conexiunii,
a) 1.4.2.3.5
c) 1.5.4.2.1
b) 4.1.2.3.5
d) 4.1.3.2.5
5. Care din urmatoarele functii se foloseste pentru a accesa o baza de date MySQL in PHP?
14

Modulul 5. Persistenta datelor cu PHP


a) functia mysqlconnect()
c) functia mysql_connect()
b) functia mysql-connect()
d) functia sql_connect()
6. Care statement este folosit pentru a sterge un tabel in PHP?
a) DROP TABLE
c) DEL TABLE
b) DELETE TABLE
d) REMOVE TABLE
7. Folosim ...... pentru a sterge datele dintr-un tabel, si nu tabelul insusi:
a) DROP TABLE
c) TRUNCATE TABLE
b) DELETE TABLE
d) REMOVE TABLE
8. Ce functie folosim pentru a lista toate bazele de date disponibile in conexiune?
a) mysql_query()
c) mysql_list_dbs()
b) mysql_connect()
d) mysql_list_dbs(conexiune)
9. Cum putem afla lungimea unui camp din tabela rezultat a unei interogari?
a) folosind functia mysql_query()
c) folosind un query specific
b) folosind functia mysql_field_type()
d) folosind functia mysql_field_len()
10. Pentru a parcurge un rezultat intors de o interogare SQL folosim:
a) functia mysql_fetch_row()
c) func ia mysql_fetch_array()
b) functia mysql_query()

d) functia mysql_fetch_object()

n acest capitol am discutat problemele esen iale ale conceptului de excep ie,
tratarea exceptiilor i implement ri specifice PHP ale exceptiilor. Astfel, am
discutat despre membrii clasei Exception care controleaz activitatea de baz n
manipularea exceptiilor. Am discutat apoi despre blocurile implicate n aruncarea,
respectiv prinderea excep iilor. Am derivat, mai departe, clasa de baz i am studiat
principalele clase predefinite, precum i am creat clase utilizator pentru tratarea
excep iilor. n final, am tratat erorile cu ajutorul excep iilor.

15

Bibliografie

Bibliografie
[1] Luke Welling, Laura Thomson, 2005, Dezvoltarea aplicatiilor WEB cu PHP si MySQL, Editia a II-a,,
Teora
[2] David Lane; Hugh E. Williams, 2002, Web Database Applications with PHP & MySQL, O'Reilly.
[3] Andi Gutmans, Stig Sather Bakken, Derick Rethans, 2005, Php 5 Power Programming Pearson
Education Inc.
[4] George Schlossnagle, 2004, Advanced PHP Programming, Sams.
[5] Kevin Tatroe, Rasmus Lerdorf, Peter MacIntyre, 2006, Programming PHP, 2nd Edition, OReilly.
[6] Larry Ulman, 2006, PHP si MySQL pentru site-uri WEB dinamice, Teora.

196

Raspusuri:

M1.U1
TO DO:
1.
2.
3.
4.

Raspuns correct b
Scripturile, comentarii,
Comentariu, /*, */
Browserul, adresa URL, scriptul, slash (/),

TO DO:
1.
2.
3.
4.
5.
6.

FALSE, TRUE
Integer, zecimal, octal
Sirurile, sirurile,
Ghilimele, valoarea, inaintea
Null, valoare, unset()
String, character, 256, mare

TO DO:
1. $ , case sensitive, numele, litera
2. Atribuirea, egale, egale, atribui, valoare, permanenta
3. Operatori, operatori, operatori, simboluri, simboluri
Test de evaluare
1. B
2. B
3. C
4. B
5. D
6. d
7. A
8. A
9. B
10. D
M1.U2
TO DO
1. IF, rezultatelor, IF - THEN ELSE, IF, THEN, ELSE
2. Repetitive, repetata, repetitive, executata, oprire, executii/iteratii
3. While, executii, while, while.

4. do... while, while, putin, cat timp, adevarata


5. foreach, iterarea, foreach, oprire, opreasca, finalul
TO DO
1. date, date de intrare, parametrii, parametrii, parantezele rounde
2. reutilizarea, execute, rescrie, functiilor, modularizare, impartirea, subprogram, usoara,
structurat, secvente,
Test de evaluare
1. D
2. D
3. D
4. C
5. C
6. B
7. C
8. A
9. D
10. C
M2.U1
TO DO
1.
2.
3.
4.

Formularele, server, servere, formularelor


Action, method, Action, gol, Method
GET, cereri, GET, GET
POST, GET, GET, POST, POST

TO DO
1. Setcookie, setcookie, valoare, cale
2. $_COOKIE, array, numele, valoarea, valoarea
3. Cookie, expirare, crearea, expirarii
Test de evaluare
1.
2.
3.
4.
5.
6.
7.
8.

D
C
B
C
B
C
B
D

9. A
10. C
M2.U2
TO DO
1.
2.
3.
4.
5.

session_start, cookie, cookie, session_start, Cookie


php.ini, TRUE
session_id() , SID, session_id()
session_start(),unset($_SESSION)
temporare, session_destroy()

Test de evaluare:
1.
2.
3.
4.
5.

B
C
C
B
C

M3.U1
TO DO
1.
2.
3.
4.
5.

Fopen(),modul de deschidere, fopen(),citire, scriere, scriere, sfarsit


filesize()
fclose(),inchidere, sfarsitului
mkdir(),mkdir, mod, absolut ,
fisierele, citit, scris, x

Test de evaluare
1. D
2. C
3. D
4. A, D
5. D
6. D
7. B, D
8. B, D
9. A
10. A
M4.U1

TO DO
1.
2.
3.
4.
5.
6.

mostenire , functiilor, parinte, copil, copil, 'parinte', instant


copil, fixe, final
domeniul de acces, statice, instanta, doua-puncte (::)
__destruct , __construct, constructor, Destructor, unset
Automat, inexistente, __get(),__call() , public
abstracte , instanta de obiect, metode, numele

Test de evaluare
1. B
2. A
3. A
4. B
5. C
6. A
7. A
8. A
9. A
10. B
M4.U2
TO DO
1. tratare a exceptiilor, try-catch, erorilor
2. Exception, getMessage, getLine, getCode, getFile, finale, toString,
Test de evaluare
1.
2.
3.
4.
5.

C
D
A
C
B

M5.U1
TO DO
1.
2.
3.
4.

SELECT, SELECT, FROM


Conexiune, conecta, instanta, new mysql(),
Automat, scriptul, memoria, close
Adauga, INTO, numele, valorile, numele,

Test de evaluare:
1. B, C
2. C
3. D
4. A
5. C
6. A
7. C
8. D
9. D
10. A,C,D