Sunteți pe pagina 1din 32

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor)

CAPITOLUL I Limbajul PHP (PHP Hypertext Preprocessor)


1.
Introducere. Funcionarea motorului PHP
Definiie recursiv: PHP (PHP Hypertext Preprocessor) = Preprocesorul de Hypertext PHP (Preprocesorul de Hypertext PHP (Preprocesorul de Hypertext PHP(...))) PHP (acronim recursiv pentru "PHP: Hypertext Preprocessor") este un limbaj de scripting (realizat i distribuit n sistem Open Source) ce poate fi ncapsulat n HTML i care se utilizeaz pe scar larg n aplicaiile bazate pe tehnologiile Web, inclusiv n aplicaii de comer electronic. Exemplul 1.1.
Trei scripturi elementare introductive ce conin respectiv numai cod PHP, cod PHP + cod HTML i cod PHP + cod JavaScript

<html> <head> <title>Exemplul 1 </title> </head> <body> <?php echo "Salut, eu sunt un script PHP elementar!"; ?> </body> </html> <html> <head> <title>Exemplul 2</title> </head> <body> <?php // scriptul se salveaza intr-un fisier "pagina_mea.php" echo 'Acesta este un script RECURSIV ce contine si <b>HTML</b> <br> <a href="pagina_mea.php">Legatura AUTOREFERENTIALA catre pagina mea</a>'; ?> </body> </html> <html> <head> <title>Exemplul 3</title> </head> <body> <?php echo '<html> <head><title>PHP cu JavaScript</title> <script language="JavaScript"> function alertare () { alert(Acesta este un test PHP ce contine JavaScript) // alert(\'Acesta ... JavaScript\') //ACELASI REZULTAT CA PT."" } </script> </head> <body onLoad="alertare()">

-5-

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor)


<p>Un script PHP ce contine JavaScript</p> </body> </html>';

?> </body> </html>

Se observ din acest exemplu cum difer fa de un script scris n alte limbaje cum ar fi Perl (Practical Extraction and Report Language) sau C -- n loc de a scrie un program cu o mulime de comenzi pentru a produce un HTML, se scrie un script HTML ce include cod pentru a realiza un obiectiv (n acest caz, a afia un text). Codul PHP este delimitat de coduri de start i de sfrit (<?php?>)ce i permit s intri i s iei din "modul PHP". Diferena dintre PHP i alte limbaje cum ar fi JavaScript este aceea c PHP este executat pe server pe cnd JavaScript este executat pe calculatorul clientului (de ctre programul de navigare pe Internet). Dac ar fi s ai un script similar cu cel de mai sus pe serverul tu, clientul ar primi doar rezultatele scriptului ce este rulat, fr a vedea n nici un fel codul din spatele acestuia. Se poate chiar configura serverul de web ca acesta s proceseze toate fiierele HTML cu PHP i astfel nct nici un utilizator nu poate vedea ce exist n fiierele serverului. PHP este n principal axat pe partea de scripting ce ruleaz pe server, deci se poate realiza i un program CGI(Common Gateway Interface), cum ar fi colectarea de date de la formulare, generarea de coninut dinamic sau trimitere i primire de cookie-uri.

Figura 1.1.

Funcionarea motorului PHP

Exist trei domenii principale unde sunt folosite scripturile PHP. 1. Scripturi ce ruleaz pe server. Acesta este cel mai tradiional i cel mai important pentru PHP. Sunt necesare trei lucruri pentru a face s mearg:
1. 1. Interpretorul PHP (CGI sau modul server), 1. 2. Un server de web i 1. 3. Un navigator de web.

Este nevoie ca serverul de web s fie pornit, cu o conexiune PHP instalat. Rezultatul programelor PHP poate fi vizualizat cu un navigator prin intermediul serverului de web.
2.

Scripting la linia de comand. Se poate face ca PHP s ruleze fr a fi nevoie de server i de browser, ci doar de interpretorul PHP. Aceast metod este ideal pentru scripturile ce se vor a fi executate regulat folosind cron (task scheduler n Windows), sau sarcini simple de procesare a textelor.

-6-

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor)


3.

Scrierea de aplicaii ce ruleaz pe partea clientului n mod grafic (GUI). Se pot folosi facilitile avansate ale PHP-ului n aplicaiile ce ruleaz de partea clientului prin exploatarea extensiei PHP-GTK pentru a scrie astfel de programe care pot rula, de asemenea pe platforme diferite folosind aceast metoda.

PHP poate fi folosit pe aproape toate marile sisteme de operare, incluznd Linux, multe variante de Unix (incluznd HP-UX, Solaris i OpenBSD), Microsoft Windows, Mac OS X, RISC OS, probabil i altele. PHP are, de asemenea, suport pentru majoritatea serverelor de web din prezent. Acestea includ serverele Apache, Microsoft Internet Information Server, Personal Web Server, Netscape i iPlanet, serverul Oreillz Website Pro, Caudium, Xitami, OmniHTTPd, i multe atele. Pentru majoritatea serverelor, PHP are un modul, iar pentru celelalte suport standardul CGI, PHP putnd s lucreze ca un procesor CGI. Deci, cu PHP, se poate alege liber un sistem de operare i un server de web. Exist, de asemenea, posibilitatea de a alege programarea procedural sau programarea orientat obiect, sau chiar un mixaj ntre aceste stiluri de programare. Una dintre cele mai puternice i importante faciliti n PHP o reprezint suportul su pentru o gam larg de baze de date. Scrierea unei pagini de web ce interacioneaz cu o baz de date este simpl i poate fi realizat pentru urmtoarele baze de date: Adabas D Ingres Oracle (OCI7 i OCI8) dBase InterBase Ovrimos Empress FrontBase PostgreSQL FilePro (doar citire) mSQL Solid Hyperwave Direct MS-SQL Sybase IBM DB2 MySQL Velocis Informix ODBC Unix dbm n plus, PHP suport ODBC, standardul Open DataBase Connectivity, care permite conectarea la orice alt baz de date care este realizat dup o tehnologie ce suporta acest standard mondial. Funciile PHP pentru acces la bazele de date nu sunt standardizate. Aceasta conduce la necesitatea existenei unei biblioteci de clase pentru baze de date care s ascund diferenele ntre API(Aplication Program Interface) ale diverselor servere de baze de date (i.e. s ncapsuleze particularitile implementrilor acestora) astfel nct interschimbul de informaii privitoare la bazele de date i coninutul lor s se realizeze facil. O implementare care satisface aceste cerine este ADOdb (ActiveX Data Objects for Data Base). n momentul de fa biblioteca ADOdb suport Access, MySQL, Oracle, Microsoft SQL Server, Sybase, Sybase SQL Anywhere, Informix, PostgreSQL, FrontBase, Interbase (variantele Borland i Firebird), FoxPro, ADO, DB2, SAP DB i ODBC. PHP se poate folosi cu succes n domeniul comerului electronic, existnd deja un mare arsenal de funcii pentru plai on-line, funcii de plat Cybercash, CyberMUT, VeriSign Payflow Pro i CCVS. Exemplul 1.2.
Afiarea unei variabile care este element al unui tablou (Variabila superglobal _SERVER)

<?php //Afisarea unei variabile care este element al unui tablou //(Variabila superglobala) _SERVER) echo $_SERVER['HTTP_USER_AGENT']; ?> Rspunsul va fi:

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322) -7-

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor) Exemplul 1.3.


Utilizarea structurii de control condiionale IF i a funciilor

<?php //Utilizarea structurii de control conditionale IF si a functiilor if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) {echo 'Utilizati MS-Internet Explorer pentru navigare.<br />';} else {echo 'Multumiri pentru utilizarea MS-Internet Explorer!.<br />';} ?> Rspunsul va fi:

Utilizati MS-Internet Explorer pentru navigare. Exemplul 1.4.


Mixaj ntre HTML i PHP

<?php //Mixaj ntre HTML si PHP if (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== FALSE) { ?> <h3>Functia strpos() a intors valoarea ADEVARAT</h3> <p>Utilizati MS-Internet Explorer pentru navigare </p> <?php } else { ?> <h3> Functia strpos() a intors valoarea FALSE</h3> <p> NU utilizati MS-Internet Explorer pentru navigare </p> <?php } ?> Rspunsul va fi: Functia strpos() a intors valoarea ADEVARAT Utilizati MS-Internet Explorer pentru navigare

2.

Elemente de sintax ale limbajului PHP

Marcaje de delimitare. Scripturile PHP pot fi incluse n paginile Web n diferite moduri, uzual folosindu-se construcia: < ?php ... ? > Comentariile pot fi scrise n stilul comentariilor din limbajele C/C++ ori Perl /* ... */ sau //. . . sau #. . .

Caracterul terminal Declaraiile i instruciunile se separ prin ;" ca i n C, Perl sau Java ; -8-

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor) Funcionarea analizorului (motorului) PHP este urmtoarea: preprocesorul PHP va detecta construciile PHP delimitate ntre tag-urile <?php i ?> i le va interpreta, ignornd restul coninutului documentului pe care l va trimite, la ieirea standard, nealterat. Astfel, putem privi analizorul PHP ca un script CGI care efectueaz o preprocesare special nainte ca datele s fie expediate clientului Web. PHP se bazeaz pe motorul de scripting Zend.

3.

Tipurile de date

Tipurile de date simple suportate sunt cele scalare: 1. 2. 3. 4. Valori logice (boolean), Numere ntregi (integer), Numere reale n virgul mobil (float, double, real) ir de caractere (string).

Tipurile de date structurate sunt reprezentate de: 1. Tipul tablou (array) - indexat i asociativ 2. Tipul obiect (object) Tipurile de date speciale sunt reprezentate de: 1. Tipul resurs (resource) 2. Tipul nul (NULL) irurile de caractere se pot delimita ntre ghilimele ( ) sau caracterele apostrof (...), n acest ultim caz inhibndu-se evaluarea variabilelor din interiorul irului respectiv (exact ca la script-urile bash ori Perl), Variabilele n PHP se reprezint prin intermediul unui identificator prefixat de caracter $. Numele variabilei este case-sensitive (i.e. variabila $PHP este diferit de $php) i este compus din caractere alfa-numerice i simbolul _". Tipul unei variabile se determin funcie de valoarea pe care o stocheaz. Variabilele se pot folosi fr a trebui s fie declarate n prealabil. Exist, de asemenea, i diverse variabile predefinite, mai ales cele specifice serverului Web. Tot ca variabile sunt transmise unui script PHP cmpurile formularelor HTML dintr-o pagin sau cookie-urile. Un tip special sunt variabilele globale (globals) care stocheaz diverse categorii de variabile externe (de exemplu $_GET, $_POST, $_COOKIES, $_ENV etc.). Observaii: Din motive de lizibilitate, au fost introduse trei pseudo-tipuri: mixed, number i callback. Tipul double are aceeai semnificaie cu cea a tipului float. Cele dou denumiri coexist doar din motive "istorice". n PHP, de obicei, tipul unei variabile nu este specificat de ctre programator, ci este stabilit n timpul execuiei n funcie de contextul n care este folosit variabila. Tipul boolean Variabilele de acest tip pot avea doar dou valori: TRUE sau FALSE. Aceste valori sunt indicate prin cuvintele cheie TRUE sau FALSE (pentru ambele nu se face distincie ntre literele mari i -9-

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor) literele mici). Exist posibilitatea de a converti o variabil de orice tip la tipul boolean. n momentul efecturii unei conversii, sunt convertite la valoarea FALSE urmtoarele valori: numrul ntreg 0; numrul real 0.0; irul vid; irul "0"; un vector fr nici un element; un obiect fr nici o variabil membru; o variabil de tipul NULL; o variabil nedefinit. Orice alt valoare este convertit la valoarea TRUE (inclusiv resursele). Acest tip se poate folosi, de exemplu, pentru verificarea logrii ntr-o pagin de administrare. Dup ce se fac verificrile, dac utilizatorul este logat ca administrator, funcia noastr pentru verificarea logrii poate returna valoarea de adevr (TRUE), dac este logat sau valoarea contrar (FALSE) dac nu este logat, i astfel vom ti dac s i acordm sau nu acces utilizatorului n seciunea de administrare. Tipul integer O variabil de tip integer reprezint o valoare din mulimea numerelor ntregi. Aceste numere pot fi specificate n baza 10, n baza 16 sau n baza 8, conveniile fiind aceleai ca i n limbajele C/C++ sau Java. Modul de reprezentare depinde de platforma utilizat; de obicei se folosete reprezentarea pe 32 de bii. Interpretorul PHP nu ofer suport pentru numerele ntregi fr semn. Trebuie remarcat faptul c n PHP nu exist nici un operator pentru efectuarea de mpriri ntregi. De exemplu, rezultatul operaiei 3/2 nu va fi numrul ntreg 1 (ca n C/C++ sau Java), ci numrul real (float) 1.5 i pentru numerele ntregi exist posibilitatea efecturii de conversii: Valoarea logic TRUE este convertit la valoarea ntreag 1; Valoarea logic FALSE este convertit la valoarea ntreag 0; Un numr real este convertit prin "rotunjire nspre 0". Aadar, valoarea real 2.5 va fi convertit la valoarea ntreag 2, n timp ce valoarea real -2.5 va fi convertit la valoarea ntreag -2; Un ir de caractere este convertit lund n considerare doar primele caractere care conin informaii numerice. Aadar irul "10" va fi convertit la valoarea ntreag 10. De asemenea irul "10 ani" va fi convertit tot la valoarea 10; daca primele caractere nu conin informaii numerice, rezultatul conversiei va fi valoarea 0.

Tipul float O variabil de tip float poate fi specificat folosind fie forma zecimal, fie cea tiinific (cu exponent). La fel ca i n cazul tipului integer, precizia variabilelor de tipul float este dependent de platforma utilizat. De obicei se folosete standardul IEEE 64. Exist posibilitatea de a converti o variabil de orice tip la tipul float. Pentru numerele reale se pot efectua urmtoarele conversii: - 10 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor)

Un ir de caractere este convertit lund n considerare doar primele caractere care conin informaii numerice; aadar irul "10.2" va fi convertit la valoarea real 10.2; irul "1.23E1 ani" va fi convertit la valoarea 12.3; n toate celelalte cazuri se realizeaz conversii la numere ntregi care apoi sunt convertite la valorile reale corespunztoare.

Tipul string O variabil de tip string reprezint un ir de caractere. Un caracter se reprezint pe un octet, deci sunt 256 de caractere distincte. Acest lucru implic faptul c interpretorul PHP nu ofer suport nativ pentru setul de caractere Unicode. Lungimea variabilelor de tip string nu este limitat de ctre interpretor. Literalii de tip ir de caractere pot fi specificai n trei moduri diferite: Prin folosirea ghilimelelor simple (apostrofelor) ' (Exemplu: $a='acesta este un sir de caractere'). Pentru a avea n cadrul irului simbolul apostrof " ' ", atunci naintea acestuia trebuie scris caracterul "\", iar pentru a putea specifica simbolul "\" acesta trebuie dublat. Prin folosirea ghilimelelor duble ". Folosind aceast notaie, pot fi specificate mai multe caractere speciale, pe lng caracterele de la varianta anterioar, printre care:

a) sfrit de linie ("\r") b) rnd nou ("\n") c) tab orizontal ("\t") d) semnul dolar ("\$") e) ghilimelele duble ("\"") f) secvene de caractere pentru specificarea expresiilor regulate n notaie octal
("\[0-7]{1,3}")

g) secvene de caractere pentru expresiile regulate n notaie hexazecimal


("\x[0-9A-Fa-f]{1,2}"). Cel mai important lucru este acela c, folosind acest mod de specificare a literalilor de acest tip, numerele de variabile care apar n interior vor fi transformate n valoarea lor. De exemplu, dac $a este o variabil de tipul integer i are valoarea 2, atunci irul de caractere "Variabila a are valoarea $a." va fi transformat n irul "Variabila a are valoarea 2". Notaia heredoc. Acest tip de notaie a fost introdus la versiunea 4 a interpretorului PHP. Pentru a specifica un ir de caractere folosind aceast notaie, trebuie utilizat operatorul "<<<" urmat de un identificator ales de utilizator. Toate caracterele care se afl ntre operatorul "<<<", urmat de un identificator pe o singur linie, i acelai identificator pe o alt linie, vor constitui valoarea irului de caractere. De exemplu, instruciunea: $str=<<<SF. Acesta este un exemplu de utilizare a sintaxei heredoc SF; va avea ca rezultat un ir de caractere format din trei linii de text.

- 11 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor) Pentru a accesa un anumit caracter din irul de caractere, se folosete, dup numele variabilei de tip string, indicele caracterului care trebuie accesat scris ntre acolade. De exemplu, $str{0} returneaz primul caracter din irul de caractere $str. n cazul n care dorim s concatenm dou iruri de caractere, vom folosi operatorul "." Folosirea operatorului "+" nu va concatena cele dou iruri. Exist posibilitatea de a converti o variabil de orice tip la tipul string. Pentru irurile de caractere, se pot efectua urmtoarele conversii: Valoarea logic TRUE va fi convertit la irul "1", iar valoarea logic FALSE va fi convertita la irul vid (""); Un numr ntreg va fi convertit la un ir de caractere care reprezint valoarea numrului n baza 10; Un numr real va fi convertit la un ir de caractere care reprezint notaia tiinific a acestuia; Obiectele sunt ntotdeauna convertite la irul "Object"; Variabilele de tipul resource sunt convertite la irul "Resource id #n", unde n reprezint un numr unic ataat resursei respective de ctre interpretorul PHP; Valoarea NULL este convertit la irul vid (""). Variabile predefinite $GLOBALS = pot fi accesate toate variabilele globale care sunt accesibile script-ului PHP curent $_SERVER = conine o serie de variabile ale cror valori sunt setate de server-ul web; majoritatea valorilor variabilelor din acest vector depind de mediul de execuie al script-ului curent. $_GET i $_POST conin variabile primite de script prin intermediul unor transferuri care folosesc metodele HTTP get, respectiv post. De exemplu, prin intermediul acestor vectori, pot fi accesate valorile cmpurilor dintr-un formular care a fost completat i transmis folosind una dintre cele dou metode. $_COOKIE conine valorile variabilelor care cuprind informaii referitoare la cookie-urile pstrate pe calculatorul utilizatorului ce acceseaz pagina Web. $_FILES conine variabile primite de script prin intermediul ncrcrilor de fiiere prin metoda post. $_ENV conine variabile disponibile prin intermediul mediului n care este executat. $_REQUEST conine variabile disponibile prin intermediul oricrui tip de mecanism cu ajutorul cruia utilizatorul poate introduce date. $_SESSION conine variabile care corespund sesiunii curente a script-ului. Tipul array Vectorii n PHP sunt mulimi formate din chei. Fiecrei chei din vector i se ataeaz o valoare. Acest tip de date este optimizat astfel nct s poat fi folosit n locul urmtoarelor structuri de date: liste, tabele de dispersie, dicionare, colecii, stive, cozi i altele. Datorit faptului c o valoare poate fi chiar un alt vector, se pot simula foarte uor arborii ndimensionali sau tablourile n-dimensionale. Valoarea unei variabile de tip vector se poate specifica folosind construcia: array (cheie => valoare, cheie => valoare, ...)

- 12 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor) De exemplu, urmtoarea instruciune PHP va construi un vector cu dou elemente, dintre care unul este de tip string, iar cellalt de tip boolean: $a = array('ch' => 'string', 12 => TRUE); Variabila $a reprezint un vector, $a["ch"] are valoarea string, iar $a[12] are valoarea TRUE. n cazul n care nu se specific o cheie pentru o valoare, atunci acea valoare va fi ataat unei chei care va fi cheia maxim de tip integer folosit anterior, la care se adaug valoarea 1. Cheile pot avea i valori negative. Dac nu exist chei de tip integer, atunci valoarea va fi ataat cheii 0. De exemplu, urmtoarele dou instruciuni sunt echivalente: array(5 => 43, 32, 56, 'b' => 12); array(5 => 43, 6 => 32, 7 => 56, 'b' => 12);

Dac se folosete valoarea logic TRUE ca i cheie, atunci aceasta va fi convertit la cheia de tip ntreg 1, iar valoarea FALSE va fi convertit la numrul ntreg 0. Nu se pot folosi pentru chei variabile de tipul array sau object. O variabil de tip array se poate modifica prin setarea explicit de valori. De exemplu instruciunea: $a["x"] = 42; adaug n vectorul $a valoarea 42 ataat cheii "x". Dac se folosete un vector care nu a fost definit anterior, atunci acesta este creat automat. Aadar printr-o instruciune de forma $a[5] = 42, n cazul n care vectorul $a nu exist, atunci se va crea un vector cu un singur element. Cheia acestuia va fi numrul ntreg 5, iar valoarea sa va fi 42. De asemenea, exist posibilitatea de a crea un element nou fr a-i preciza cheia. Sintaxa are forma : $vector[] = valoare; Aceasta instruciune are ca efect adugarea unui element a crui cheie este un numr ntreg mai mare cu 1 dect cel mai mare numr ntreg care este cheie a unui alt element al vectorului. Dac nu exist nici o astfel de cheie, atunci noul element va avea cheia 0. De exemplu, urmtoarele dou secvene sunt echivalente: $a[5] = 1; ............................ $a[5] = 1; $a[6] = 2; ............................ $a[] = 2; Prin conversia la un vector a unei variabile de tip scalar (boolean, integer, float, string) sau resource se creeaz un vector cu un singur element; cheia acestui element este numrul ntreg 0, iar valoarea este cea a variabilei convertite. Dac se convertete un obiect (variabil de tip object), atunci vectorul rezultat va conine cte un element pentru fiecare variabil membru a obiectului. Cheile elementelor vor fi date de denumirile - 13 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor) proprietilor obiectului (variabilele membru ale obiectului), iar valorile elementelor vor fi valorile proprietilor obiectului. Dac realizm o conversie a unei variabile de tip NULL, atunci rezultatul va fi un vector vid (care nu conine nici un element). n continuare sunt prezentate cteva exemple care descriu mai detaliat posibilitile oferite de folosirea vectorilor n PHP. Pentru nceput, iat un vector ale crui elemente reprezint caracteristicile unei portocale:
<?php $a = array ('denumire' => 'portocala', 'familie' => 'citrice', 'culoare' => 'portocaliu', 'forma' => 'rotunda', 'gust' => 'dulce' ); echo $a['denumire'].' <br> '.$a['familie']; ?>

Putem aduga i alte elemente care s reprezinte diferite alte proprieti. De exemplu, am putea avea nevoie de o valoare suplimentar creia nu dorim s i atribuim nici un nume de identificare (cheie). Pentru ca vectorul s conin un element suplimentar cu valoarea 4, vom putea defini vectorul astfel:
<?php $v = array ('denumire' => 'portocala', 'familie' => 'citrice', 'culoare' => 'portocaliu', 'forma' => 'rotunda', 'gust' => 'dulce', 4 ); echo $v['denumire'].' <br> '.$v['familie']; ?>

Scriptul 1.1. array1.php - Cheia elementului cu valoarea 4 va fi numrul ntreg 0 deoarece nu exist nici o
alt cheie care este numr ntreg.

<?php $v['denumire'] = 'portocala'; $v['familie'] = 'citrice'; $v['culoare'] = 'portocaliu'; $v['forma'] = 'rotunda'; $v['gust'] = 'dulce'; $v[] = 4;

- 14 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor)


echo $v['denumire'].' <br> '.$v['familie']; ?>

Scriptul 1.2. array2.php - O alternativa de construire a aceluiai vector v cu acelai rezultat n browser.

<?php $fructe = array ( 'denumire' => array('p' => 'portocala', 'a' => 'ananas', 'm' => 'mar'), 'numere' => array(1, 2, 3, 4, 5, 6), 'ordine' => array('prima', 5 => 'a II-a', 'a III-a') ); echo 'Denumire: '.$fructe['denumire']['p'].' - '.$fructe['denumire']['a'].' <br>'; echo 'Numere: '.$fructe['numere'][0].' - '.$fructe['numere'][1].' <br>'; echo 'Ordine: '.$fructe['ordine'][0].' - '.$fructe['ordine'][5].' <br>'; ?>

Scriptul 1.3. array3.php - Folosirea unor array-uri ale cror elemente sunt alte array-uri.

Tipul object Pentru a defini un obiect care poate fi folosit pentru afiarea mesajului Salutare lume!, se scrie urmtoarea secven:
<?php class Salutare { function AfiseazaSalutare() { echo 'Salutare lume!'; } } $a = new Salutare; echo $a -> AfiseazaSalutare();

- 15 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor)


?>

Scriptul 1.4. clasa.php Definirea unui obiect elementar cu o singur metod Se observ faptul c este afiat textul Salutare lume!, text ce l-am introdus n funcia AfiseazaSalutare(). Pentru a utiliza o variabila de tip obiect, va trebui s realizm o instaniere a obiectului prin intermediul instruciunii new. Sintaxa ei este:
$a = new Salutare

Astfel, variabila $a devine un obiect ale crui metode pot fi utilizate. Pentru afiarea propriu-zis a mesajului va trebui s executm metoda AfiseazaSalutare() printr-o instruciune de tipul: $a-> AfiseazaSalutare(); Orice variabil de un anumit tip poate fi convertit ntr-un obiect : Dac variabila respectiv este un obiect, atunci ea nu va fi modificat. n caz contrar, efectul conversiei este crearea unei noi instane a clasei stdClass. Dac variabila are tipul NULL, atunci noua instan va fi vid. n toate celelalte cazuri, instana va conine o variabil membru numit scalar a crei valoare va fi cea a variabilei convertite. Pentru conversii se folosesc instruciuni de tipul $obiect = (object) "Salutare lume!". Dup realizarea conversiei, se poate tipri mesajul Salutare lume! folosind instruciunea echo $obiect->scalar; Tipul resource Variabilele de tip resource sunt folosite pentru pstrarea unor referine ctre anumite resurse externe cum ar fi conexiuni la baze de date, fiiere, etc. Resursele sunt create i utilizate de anumite funcii speciale. Datorit specificului acestui tip de date, valoarea nici unei variabile de alt tip nu poate fi convertit la tipul resource. Tipul NULL Valoarea special NULL este atribuit oricrei variabile care nu a fost nc iniializat. Aceast valoare este singura pe care o pot avea variabilele de tip NULL. Se consider c o variabil are tipul NULL dac: i s-a atribuit constanta NULL; nu a fost iniializat; - 16 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor) a fost deziniializat (prin intermediul funciei unset () ). Constantele pot fi considerate variabile ale cror valori sunt fixate i nu mai pot fi alterate pe parcursul programului. O constant stocheaz o valoare, precum face i o variabil, dar aceast valoare nu mai poate fi modificat n script, dup ce a fost stabilit (i.e. constanta a fost definit). Pentru a defini o constant se va folosi construcia sau funcia define( ). Numele constantelor va fi scris, de obicei cu majuscule. Aceasta opiune nu este obligatorie, ns este recomandabil deoarece va face codul mai frumos i mai lizibil. O diferen important ntre constante i variabile, este faptul c o constant nu are n faa ei semnul $. Exemplul 1.5. Definirea constantelor
<?php define('AUTOR', 'Eugen ZAHARESCU'); define('VARSTA', '50 de ani'); echo "<u>Autorul manualului este:</u> <b>".AUTOR.'</b> <br> '.'<u>Initializat in urma cu:</u> <b>' .VARSTA."</b>"; ?>

Ca exemple de constante predefinite se pot da PHP_VERSION, PHP_OS sau CHAR_MAX.

4.

Operatorii

PHP pune la dispoziie un set impresionant de operatori. Aceti operatori sunt cei disponibili n limbaje precum C sau Perl. Categoriile importante de operatori sunt: Operatorii aritmetici (+, -, *, /, %) sunt cei cunoscui din clasicele limbaje C/C++, Java, etc. Operatorii aritmetici Exemple $a + $b $a - $b $a * $b $a / $b $a % $b Nume Adunare Scdere nmulire mprire Modulo Rezultat Suma lui $a cu $b. Diferena dintre $a i $b. Produsul lui $a cu $b. Ctul mpririi lui $a la $b. Restul mpririi lui $a la $b.

Operatorii de asignare (= sau +=") Exemplul 1.6.


Utilizarea operatorilor de asignare = , +=" i concatenare .=

<?php //Operatori de asignare "=" sau "+=" $a = ($b = 4) + 5; // $a este egal cu 9 si $b a fost setat la 4. echo "a=",$a,"<br />","b=",$b; $a = 3; $a += 5; // seteaza $a la 8, ca si in expresia: $a = $a + 5; $b = "Salut "; $b .= "PHP!"; // seteaza $b la "Salut PHP!", ca si in $b = $b . "PHP!"; echo "a=",$a,"<br />","b=",$b; ?>

- 17 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor) Operatorii la nivel de bit (&,|,^, ~, <<, >>)
,

Operatorii la nivel de bit Exemple $a & $b $a | $b $a ^ $b ~ $a $a << $b $a >> $b Nume And Or Xor Not Shift left Shift right Rezultat Biii setai la 1 n $a i n $b vor fi setai la 1. (i bit cu bit) Biii setai la 1 fie $a, fie n $b vor fi setai la 1. (sau bit cu bit) Biii setai 1 fie $a, fie n $b dar nu simultan vor fi setai 1. (sau exclusiv) Biii setai la 1 n $a, vor fi resetai la 0, i vice versa. (not bit cu bit) Deplaseaz $b poziii spre stnga biii lui $a. Deplaseaz $b poziii spre dreapta biii lui $a.

Operatorii relaionali (ca noutate se poate meniona aici ===" care are ca rezultat constanta TRUE dac operanzii au valori identice i n plus sunt de acelai tip) Operatorii relaionali Exemple $a == $b $a === $b $a != $b $a <> $b $a !== $b $a < $b $a > $b $a <= $b $a >= $b Nume Egalitate Identitate Diferit Diferit Non-identitate Mai mic dect Mai mare dect Mai mic sau egal cu Mai mare sau egal cu Rezultat TRUE dac $a este egal cu $b. TRUE dac $a este egal cu $b i sunt de acelai tip. (PHP 4) TRUE dac $a nu este egal cu $b. TRUE dac $a nu este egal cu $b. TRUE dac $a nu este egal cu $b sau nu sunt de acelai tip. (PHP 4) TRUE dac $a este strict mai mic dect $b. TRUE dac $a este strict mai mare dect $b. TRUE dac $a este mai mic sau egal cu $b. TRUE dac $a este mai mare sau egal cu $b.

Un alt operator condiional este operatorul teriar "? :". Expresia (expr1) ? (expr2) : (expr3) se evalueaz la expr2 dac expr1 este evaluat la valoarea TRUE i la expr3 dac expr1 este evaluat la valoarea FALSE. Exemplul 1.7.
Utilizarea operatorului condiional teriar "?:". Structura (expr1) ? (expr2) : (expr3)

<?php //Operator condiional tertiar "?:". Structura (expr1) ? (expr2) : (expr3) $variabila = "CORECTA"; echo $variabila == "CORECTA" ? "Variabila are valoarea CORECTA" : "Variabila nu are valoarea CORECTA"; ?>

Operatori de control al erorilor (@ )(exist un singur operator @ care inhib erorile ce pot aprea n cadrul expresiei pe care o prefixeaz),

- 18 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor) Operatori de incrementare / decrementare (++ i ) Exemple ++$a $a++ --$a $a-Operatori de incrementare / decrementare Nume Rezultat Pre-increment Incrementeaz $a cu 1, apoi ntoarce $a. Post-increment ntoarce $a, apoi incrementeaz $a cu 1. Pre-decrement Decrementeaz $a cu 1, apoi ntoarce $a. Post-decrement ntoarce $a, apoi decrementeaz $a cu 1.

Operatori logici (and sau &&", or sau | |", xor, !") Operatori logici Exemple $a and $b $a && $b $a or $b $a || $b $a xor $b ! $a Nume And And Or Or Xor Not Rezultat TRUE dac ambele $a i $b sunt TRUE. TRUE dac ambele $a i $b sunt TRUE. TRUE dac fie $a sau $b sunt TRUE. TRUE dac fie $a sau $b sunt TRUE. TRUE dac fie $a, fie $b sunt TRUE, dar nu simultan ambele. TRUE dac $a nu este TRUE.

Operatori pentru iruri de caractere Se definete operatorul de concatenare . similar celui din Perl. Poate fi folosit, de asemenea i operatorul de test ? :" i operatorul de concatenare (.=), care adaug argumentului din partea stng, argumentul din partea dreapt. Exemplul 1.8.
Utilizarea operatorului de concatenare "." pentru iruri de caractere

<?php //operatorul de concatenare "." pentru siruri de caractere $a = "Hello "; $b = $a . "World!"; // $b contine "Hello World!" $a = "Hello "; $a .= "World!"; ?> // $a contine de asemenea "Hello World!"

5.

Instruciunile limbajului PHP

Instruciunile limbajului PHP sunt cele uzuale din alte limbaje de programare. Sunt disponibile instruciuni de atribuire (de forma $variabil = expresie), instruciuni de test (if i switch), instruciuni repetitive (while, do, for, foreach) i instruciuni de control (break, continue, return).

- 19 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor)

5.1.

Structuri condiionale

5.1.1. Instruciunea
<?php if (expresie) instruciune ?>

if

Mai nti, expresie (de tipul boolean) este evaluat la valoarea ei logic. Dac expresie este evaluat la valoarea TRUE, atunci PHP va executa instruciune iar dac expresie este evaluat la valoarea FALSE atunci PHP va ignora instruciune. 5.1.2. Instruciunea

else

Instruciunea else este executat dac expresia logic dup if este evaluat la valoarea FALSE ca i toate expresiile logice elseif succesoare (dac exist). Altfel spus, toate expresiile logice predecesoare trebuie sa fie evaluate la valoarea FALSE.
<?php $a=1;$b=2; if ($a > $b) { echo "a mai mare decat b";} else { echo "a NU este mai mare decat b";} ?>

5.1.3. Instruciunea

elseif

Instruciunea elseif este o combinaie de if and else. Precum else, extinde o instruciune if pentru a executa o alta instruciune diferit n cazul n care expresia logic original if este evaluat la FALSE. Totui, spre deosebire de else, ramura alternativ va fi executat dac i numai dac expresia condiional elseif este evaluat la TRUE. Exemplul 1.9.
Utilizarea structurii condiionale if..elseif..else

<?php //Structura conditionala if..elseif..else $a=1;$b=2; if ($a > $b) {echo "a mai mare decat b";} elseif ($a == $b) {echo "a este egal cu b";} else {echo "a mai mic decat b";} ?>

Pot fi mai multe elseif n aceeai instruciune if. Prima alternativ elseif pentru care expresia logic este evaluat la TRUE va fi executat. n PHP, se poate scrie 'else if' (n 2 cuvinte) cu acelai comportament, identic ca i n cazul lui 'elseif' (ntr-un singur cuvnt). 5.1.4. Instruciunea

switch

Instruciunea switch este asemntoare cu o serie de instruciuni if cu aceeai expresie logic. n multe situaii, se dorete compararea aceleiai variabile (sau expresii) cu mai multe valori diferite i - 20 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor) s se execute secvene diferite de cod depinznd de valoarea ei la un moment dat. Instruciunea structurat switch a fost proiectat tocmai pentru acest lucru. Not: Spre deosebire de alte limbaje de programare, instruciunea continue se aplic i acioneaz similar cu break. Dac exist un switch n interiorul unui ciclu i se dorete s se continue cu urmtoarea iteraie a ciclului exterior, se va utiliza continue 2. Urmtoarele 2 exemple ilustreaz dou modaliti de a scrie acelai lucru: una prin utilizarea unei cascade de instruciuni if i elseif, i alta prin utilizarea instruciunii switch: Exemplul 1.10. Utilizarea structurii condiionale if..elseif i echivalentul ei switch..case
<?php //Structura conditionala if..elseif si echivalentul ei switch..case $i=0; echo "STRUCTURA CONDITIONALA if..elseif<br />"; if ($i == 0) { echo "i este egal cu 0"; } elseif ($i == 1) { echo "i este egal cu 1"; } elseif ($i == 2) { echo "i este egal cu 2"; } echo "<br /><br />STRUCTURA CONDITIONALA switch..case<br />"; switch ($i) { case 0: echo "i este egal cu 0"; break; case 1: echo "i este egal cu 1"; break; case 2: echo "i este egal cu 2"; break; } ?>

Pentru a evita greelile este important de neles cum este executat instruciunea switch. Instruciunea switch se execut linie cu linie (de fapt, instruciune cu instruciune). La nceput, nu se execut nici un cod. Numai cnd se ntlnete o instruciune case cu o valoare care se potrivete valorii expresiei switch atunci PHP ncepe ntr-adevr s execute instruciunile alternativei respective. PHP va continua s execute instruciunile pn la sfritul blocului switch, sau pn la prima apariie a instruciunii break. Dac nu se adaug o instruciune break la sfritul listei de instruciuni case, PHP va continua s execute instruciunile urmtoarei alternative case. Exemplul 1.11. Utilizarea structurii condiionale switch..case fr break
<?php //Fara break la sfrsitul listei de instructiuni case... //...PHP va continua sa execute instructiunile urmatoarei alternative case $i=0; switch ($i) { case 0: echo "i este egal cu 0<br />"; case 1:

- 21 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor)


echo "i este egal cu case 2: echo "i este egal cu } ?> 1<br />"; 2<br />";

n acest exemplu, dac $i este egal cu 0, PHP ar executa toate instruciunile echo. Dac $i este egal cu 1, PHP ar executa ultimele 2 instruciuni echo. Comportamentul dorit se obine numai dac $i este egal cu 2 (i.e. va fi afiat textul 'i este egal cu 2'). De aceea este important s nu se uite inserarea instruciunilor break n structura de ramificare multipl switch. ntr-o instruciune switch, condiia este evaluat numai o dat i rezultatul este comparat cu fiecare instruciune case. ntr-o instruciune elseif, condiia este evaluat din nou. Dac condiia este mai complicat dect o simpl comparaie i/sau se afl ntr-un ciclu foarte strns, o instruciune switch poate fi mai rapid. Lista de instruciuni pentru un case poate fi de asemenea vid, ceea ce face s treac controlul spre lista de instruciuni a urmtorului case. Exemplul 1.12. Utilizarea structurii condiionale switch..case cu alternative vide
<?php //Structura $i=0; switch ($i) case 0: case 1: case 2: echo "i break; case 3: echo "i } ?>

case cu alternative vide... {

este mai mic decat 3 dar nu negativ"; este 3";

O situaie special o reprezint alternativa case denumit default. Aceast alternativ corespunde oricror altor cazuri care nu s-au potrivit celorlalte alternative case i trebuie s fie ultima instruciune (alternativ) case. Exemplul 1.13. Utilizarea structurii condiionale switch..case cu alternativa default

<?php //Structura $i=3; switch ($i) case 0: echo "i break; case 1: echo "i break; case 2: echo "i

case cu alternativa default... { este egal cu este egal cu este egal cu 0"; 1"; 2";

- 22 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor)


break; default: echo "i nu este egal cu 0, 1 sau 2"; } ?>

Expresia case poate fi orice expresie care poate fi evaluat la un tip simplu de dat: integer, floating-point numbers sau strings. Arrays sau objects nu pot fi utilizate dect dac ele sunt redefinite ca tipuri simple. Se pot utiliza i alte sintaxe, alternative, pentru structurile de control ale ramurilor instruciunii structurate switch: Exemplul 1.14. Utilizarea structurii condiionale switch..case cu sintaxa alternativ ":" + endswitch

<?php //Structura case cu sintaxe alternative ":" + endswitch; $i=3; switch ($i): case 0: echo "i este egal cu 0"; break; case 1: echo "i este egal cu 1"; break; case 2: echo "i este egal cu 2"; break; default: echo "i nu este egal cu 0, 1 sau 2"; endswitch; ?>

5.2.

Structuri repetitive

5.2.1. Instruciunea

while

Ciclurile while reprezint cele mai simple cicluri n PHP. Ele se comport exact precum structurile similare din limbajul C. Structura de baz a sintaxei unei instruciuni while este:
while (expresie) instruciune;

Instruciunea while determin PHP s execute instruciunile incluse n mod repetat, atta timp ct expresia while este evaluat la valoarea TRUE. Valoarea expresiei este verificat de fiecare dat la nceputul ciclului, astfel nct chiar dac aceast valoare se modific n timpul execuiei instruciunilor incluse, execuia nu se va opri pn la sfritul iteraiei (rularea tuturor instruciunilor din cadrul ciclului). Atunci cnd expresia while este evaluat la valoarea FALSE de la nceput, instruciunile din cadrul ciclului nu vor fi executate nici mcar o dat. Ca i n cazul instruciunii if, se pot grupa mai multe instruciuni n cadrul aceleiai instruciuni repetitive while prin ncadrarea lor cu paranteze acolad {} sau prin utilizarea sintaxei alternative: - 23 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor)


while (expr): instruciune ... endwhile;

Exemplele urmtoare sunt identice i ambele afieaz numerele de la 1 la 10: Exemplul 1.15. Utilizarea structurii repetitive while

<?php /* exemplul 1 */ $i = 1; while ($i <= 10) { echo $i++, ;/*(post-increment) se afiseaza $i inainte de incrementare*/ } /* exemplul 2 */ echo <br/>; $i = 1; while ($i <= 10): echo $i, ; $i++; endwhile; ?>

5.2.2. Instruciunea

do..while

Ciclurile do..while sunt foarte asemntoare ciclurilor while, cu excepia faptului c expresia logic este verificat la sfritul fiecrei iteraii i nu la nceputul ei. Principala diferen fa de ciclurile while obinuite este c prima iteraie a ciclului do..while se execut ntotdeauna (pentru c expresia logic este verificat de abia la sfritul ciclului). Acest comportament nu se ntlnete i la ciclurile while obinuite (pentru c expresia logic este verificat la nceputul fiecrei iteraii iar dac este evaluat la valoarea FALSE atunci execuia ciclului se ncheie imediat). Structura sintactic a unui ciclu do..while este:
<?php $i = 0; do { echo $i; } while ($i > 0); ?>

Ciclul de mai sus este executat o singur dat deoarece dup prima iteraie, expresia logic este evaluat la valoarea FALSE ($i nu este mai mare dect 0). Programatorii n C experimentai utilizeaz uneori n mod diferit ciclul do..while, permind ntreruperea execuiei n mijlocul blocului de instruciuni, prin construirea unui ciclu infinit do..while i includerea instruciunii break precum n exemplul urmtor (1): Exemplul 1.16. Utilizarea structurii repetitive do..while(1) ca un ciclu infinit
<?php // ciclu infinit do..while (1) $factor=2;

- 24 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor)


$limita_minima=100; $i=5; //Se termina la a doua structura if //$i=0; // Se termina la prima structura if $i=5; do { if ($i < 5) { echo "Variabila i nu este suficient de mare"; break; } $i *= $factor; if ($i > $limita_minima) { echo "<br/>i=",$i," i este prea mare!.. >",$limita_minima; break; } echo "<br/>i=",$i," Variabila i este O.K.!"; /* proceseaza i */ } while (1); ?>

5.2.3. Instruciunea

for

Ciclurile for sunt cele mai complexe cicluri n PHP. Se comport precum ciclul corespunztor din C. Sintaxa ciclului for este:
for (expr1; expr2; expr3) {instruciune};

Prima expresie (expr1) este evaluat (executat) cel puin o dat n mod necondiionat la nceputul ciclului. La nceputul fiecrei iteraii, expr2 este evaluat. Dac este evaluat la TRUE, ciclul continu i instruciunile incluse sunt executate. Dac n schimb este evaluat la FALSE, execuia ciclului se termin. La sfritul fiecrei iteraii, expr3 este evaluat (executat). Fiecare din expresii poate fi vid. Dac expr2 este vid aceasta nseamn c ciclul ar trebui s se execute la infinit (PHP implicit consider c este TRUE, precum n C). Aceasta poate fi uneori util atunci cnd se dorete terminarea ciclului prin utilizarea unei instruciuni condiionate break n locul expresiei logice a lui for. Toate exemplele urmtoare vor afia numerele de la 1 la 10: Exemplul 1.17. Utilizarea structurii repetitive for. Generarea/afiarea secvenei de numere 1..10.
<?php // Generarea/afiarea secvenei de numere 1..10 echo <br/> Exemplul 1 : ; for ($i = 1; $i <= 10; $i++) { echo <br/> Exemplul 2 : ; for ($i = 1; ; $i++) { if ($i > 10) { break; echo $i, ; } echo <br/> Exemplul 3 : ; $i = 1; for (; ; ) { if ($i > 10) { break; echo $i, ; echo $i, ; }

- 25 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor)


} $i++;

echo <br/> Exemplul 4 : ; for ($i = 1; $i <= 10; prin $i, prin , $i++); ?>

PHP permite de asemenea varianta alternativ caracterului:"


for (expr1; expr2; expr3): instructiune; ...; endfor;

a ciclului for

prin utilizarea "sintaxei

<?php echo "<table border=\"1\">\n<tr><td>Celula</td></tr>\n"; $culoare = "yellow"; for ($variabila = 1; $variabila <= 10; $variabila++): if($culoare == "yellow") $culoare = "red"; else $culoare = "yellow"; echo "<tr><td bgcolor=".$culoare.">".$variabila."</td></tr>\n"; endfor; echo "</table>"; ?>

Scriptul 1.5. for_alternativ.php Tabel de culori alternative. 5.2.4. Instruciunea

foreach

PHP 4 sau 5 (nu i PHP 3) includ o construcie foreach, foarte asemntoare cu cea din Perl sau alte limbaje. Aceast structur permite iterarea n interiorul unor tablouri de elemente (arrays). Ciclul foreach lucreaz numai cu arrays i va genera o eroare atunci cnd se va ncerca utilizarea unei variabile de un alt tip de dat sau a unei variabile neiniializate. Exist 2 sintaxe a acestui ciclu:
foreach (expresie_array as $value) instruciune foreach (expresie_array as $key => $value) instruciune

Prima form itereaz peste array-ul desemnat de <expresie_array>. La fiecare ciclu, valoarea elementului curent este asignat variabilei $value pointerul intern al array-ului este incrementat cu o unitate (astfel nct n urmtorul ciclu se va face referire la urmtorul element al array-ului). A - 26 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor) doua form se comport similar, doar c indexul elementului curent se va asocia variabilei $key la fiecare ciclu. Observaii: Cnd foreach ncepe execuia primului ciclu, pointerul intern al array-ului este automat resetat la indexul primului element al array-ului. Aceasta nseamn c nu este nevoie s se apeleze reset() naintea execuiei niciunui ciclu foreach. Ciclul foreach lucreaz pe o copie a array-ului specificat i nu pe array-ul nsui. De aceea, pointerul array-ului nu este modificat precum n construcia each() i orice modificare efectuat asupra elementelor din array nu se reflect n array-ul originar. Totui, pointerul intern al arrayului originar este incrementat pe parcursul procesrii array-ului. La sfritul unei procesri complete pointerul intern al array-ului va indica ultimul element din tablou. Ciclul foreach nu poate suprima mesajele de eroare prin utilizarea lui '@'. Urmtoarele structuri funcioneaz identic: Exemplul 1.18. Utilizarea structurii repetitive foreach-prima sintax i echivalentul ei while.
<?php // Utilizarea structurii repetitive foreach-s1 i echivalentul ei while $arr = array("one", "two", "three"); reset ($arr); while (list(, $value) = each ($arr)) { echo "Valoare cu while: $value<br />"; } foreach ($arr as $value) { echo "Valoare cu foreach: $value<br />"; } ?>

Urmtoarele structuri funcioneaz, de asemenea, identic: Exemplul 1.19. Utilizarea structurii repetitive foreach-a doua sintax i echivalentul ei while.
<?php // Utilizarea structurii repetitive foreach-s2 i echivalentul ei while $arr = array("one", "two", "three"); reset($arr); while (list($key, $value) = each ($arr)) { echo "Index-while: $key; Valoare-while: $value<br />"; } foreach ($arr as $key => $value) { echo "Index-foreach: $key; Valoare-foreach: $value<br />; } ?>

Alte exemple de procesare a tablourilor de elemente: Exemplul 1.20. Utilizarea structurii repetitive foreach n diferite ipostaze de procesare a array-urilor.
<?php /* foreach exemplul 1: numai value */

- 27 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor)


echo "<br/>Exemplul-1<br/>"; $a = array(2, 4, 6, 8); foreach ($a as $v) { echo "Valoarea curenta a lui $a: $v <br/>"; } /* foreach exemplul 2: value (cu afisarea key pentru ilustrare) */ echo "<br/>Exemplul-2<br/>"; $a = array(20, 40, 60, 80); $i = 0; /* numai pentru ilustrare */ foreach ($a as $v) { echo "$a[$i] => $v<br/>"; $i++; } /* foreach exemplul 3: key si value */ echo "<br/>Exemplul-3<br/>"; $a = array( "one" => 200, "two" => 400, "three" => 600, "seventeen" => 800 ); foreach ($a as $k => $v) { echo "$a[$k] => $v<br/>"; } /* foreach exemplul 4: array multi-dimensional */ echo "<br/>Exemplul-4<br/>"; $a[0][0] = "a"; $a[0][1] = "b"; $a[1][0] = "y"; $a[1][1] = "z"; foreach ($a as $v1) { foreach ($v1 as $v2) { echo "$v2<br/>"; } } /* foreach exemplul 5: array-uri dinamice */ echo "<br/>Exemplul-5<br/>"; foreach (array(10, 20, 30, 40, 50) as $v) { echo "$v<br/>"; } ?>

5.2.5. Instruciunea

break

Instruciunea break termin execuia structurii curente din cadrul instruciunilor structurate for, foreach, while, do..while sau switch. Instruciunea break accept i un argument numeric opional care comunic cte structuri incluse, imbricate, vor fi anulate sau desfcute prin terminarea execuiei lor. Exemplul 1.21. Utilizarea break n diferite structuri repetitive.
<?php $arr = array('one', 'two', 'three', 'four', 'stop', 'five'); echo "<br />Exemplu break pentru while<br />";

- 28 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor)


while (list (, $val) = each ($arr)) { if ($val == 'stop') { break; /* Se poate scrie de asemenea si 'break 1;' aici. */ } echo "$val<br />"; } /* Utilizarea argumentului optional. */ echo "<br />Exemplu break pentru switch<br />"; $i = 0; while (++$i) { switch ($i) { case 5: echo "Break la 5<br />"; break 1; /* Iesirea numai din switch. */ case 10: echo "Break la 10; Abandonare!<br />"; break 2; /* Iesirea si din switch si din while. */ default: break; } } ?>

5.2.6. Instruciunea

continue

Aceasta instruciune este folosit pentru a ntrerupe execuia secvenei de instruciuni din interiorul unui ciclu i trecerea la urmtoarea iteraie. n cazul instruciunii for, nainte de urmtoarea iteraie se evalueaz (execut) expresia de incrementare (expresia nr_3 din sintaxa general). La fel ca i n cazul instruciunii break, poate aprea un argument care indic numrul structurilor imbricate asupra crora are efect. Exemplul urmtor realizeaz afiarea elementelor unui ir de numere ntregi care sunt mai mari dect 1000:
foreach($a as $v) { if($v <= 1000) continue; echo $v; }

Scriptul 1.6. continue1.php Afiarea selectiv a elementelor care depesc pragul de 1000.

<?php $i = 0; while($i++ < 5) { echo "Ciclul #1 <br>\n"; while(1) { echo "&nbsp;&nbsp;Ciclul #2 <br>\n"; while (1) { echo "&nbsp;&nbsp;Ciclul #3<br>\n"; continue 3; //intrerupe 3 cicluri imbricate } echo "Acest mesaj nu va fi afisat niciodata.<br>\n"; } echo "Nici acest mesaj nu va fi afisat niciodata.<br>\n"; } ?>

- 29 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor)

Scriptul 1.7. continue.php efectul folosirii argumentelor pentru instruciunea continue.

5.3.

Sintaxa alternativ pentru structurile de control

PHP ofer sintaxe alternative pentru unele din structurile sale de control cum ar fi if, while, for, foreach i switch. n fiecare caz, forma de baz a sintaxei alternative va nlocui { cu : i } cu cuvintele terminale, respectiv endif;, endwhile;, endfor;, endforeach;, sau endswitch;,
<?php if ($a == 5): ?> A este egal cu 5 <?php endif; ?>

n exemplul de mai sus, blocul HTML "A este egal cu 5" este imbricat n interiorul unei nstruciuni if scris cu sintaxa alternativ. Blocul HTML va fi afiat numai dac $a este egal cu 5. Sintaxa alternativ se aplic i structurii else and elseif n egal msur. n exemplul urmtor structurile if, elseif i else sunt n formatul alternativ: Exemplul 1.22. Utilizarea sintaxei alternative pentru structura de control if..elseif..else..endif.
<?php $a=10; if ($a == 5): echo "a este egal cu 5"; echo "..."; elseif ($a == 6): echo "a este egal cu 6"; echo "!!!"; else: echo "a nu este nici 5 nici 6"; endif; ?>

Iat n continuare un exemplu de afiare a sumei valorilor unui tablou unidimensional (vector), prin utilizarea variabilelor de tip ntreg i tablou indexat, a instruciunilor for i foreach a operatorilor relaionali, de asignare i de incrementare (funcia predefinit echo( ) afieaz la ieirea standard - aici fereastra navigatorului Web - codul HTML generat): - 30 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor) Exemplul 1.23. Generarea unui tablou de valori.
<?php // umplem un tablou cu valori de la 1 la 10 $n=20; for ($contor =1; $contor <= $n; $contor++) { $valori[$contor] = $contor; } $suma = 0; foreach ($valori as $element) // realizam suma valorilor, utiliznd foreach $suma += $element;
// afisam suma obtinuta la iesirea standard pt. a fi trimisa browserului cu echo()

echo (" <p>Suma numerelor de la 1 la ".$n." este: <b>". $suma . "</b></p>"); ?>

6.

Funcii definite de utilizator

O funcie poate fi definit prin utilizarea urmtoarei sintaxe: Exemplul 1.24. Pseudo code care ilustreaz definirea i utilizarea funciilor.
<?php function foo($arg_1, $arg_2, /* ..., */ $arg_n) { echo "Exemplu functie.\n"; return $retval; } ?>

Orice cod PHP valid poate fi inclus n interiorul unei funcii, chiar i alte funcii i definiii de obiecte (class). n PHP 3, funciile trebuiau s fi definite nainte de apelul lor. Aceste restricii au fost eliminate pentru PHP 4 i PHP 5. Face excepie cazul n care o funcie este definit condiional ca n exemplul de mai jos. Cnd o funcie este definit ntr-o manier condiional definiia sa trebuie s fie procesat naintea apelului su. Exemplul 1.25. Funcii condiionale.
<?php $makefoo = true; /* Nu se poate apela foo() de aici deoarece ea inca nu exista, dar se poate apela bar() */ bar(); if ($makefoo) { function foo() { echo "Eu nu exist pana cand executia programului nu ajunge la mine.\n"; } } /* Acum se poate apela foo() deoarece $makefoo a fost evaluata la true */ if ($makefoo) foo(); function bar() { echo "Eu exist imediat dupa startul programului.\n"; } ?>

- 31 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor)

Exemplul 1.26. Funcii imbricate n interiorul altor funcii.


<?php function foo() { function bar() { echo " Eu nu exist pana cand foo() nu este apelata.\n"; } } /* Nu se poate apela bar() inca deoarece ea nu exista. */ foo(); /* Acum se poate apela bar(),deoarece procesarea foo() a facut-o accessibila*/ bar(); ?>

6.1.

Valorile returnate de funcii

Valorile sunt returnate prin utilizarea instruciunii opionale return. Orice tip de date poate fi returnat, incluznd liste i obiecte. Aceast instruciune determin funcia s-i termine execuia sa imediat i s cedeze controlul napoi liniei de program de unde ea a fost apelat. Exemplul 1.27. Utilizarea instruciunii return()
<?php function square($num) { return $num * $num; } echo square(4); // Afiseaz '16'. ?>

Nu se pot returna valori multiple dintr-o funcie, dar rezultate similare pot fi obinute prin returnarea unei liste. Exemplul 1.28. Returnarea unui array pentru a obine valori multiple.
<?php function small_numbers() { return array (0, 1, 2);} list ($zero, $one, $two) = small_numbers(); ?>

Pentru a returna o referin(adres) dintr-o funcie, trebuie s se utilizeze operatorul referenial & att n antetul de declarare a funciei ct i atunci cnd se asociaz valorile returnate unei variabile: Exemplul 1.29. Returnarea unei referine dintr-o funcie.
<?php

- 32 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor)


function &returneaza_referinta() { return $referinta; } $referinta_noua = &returneaza_referinta(); ?>

6.2.

Variabile funcii

PHP implementeaz conceptul de variabile funcii. Aceasta nseamn c dac numele unei variabile este ncadrat de paranteze, PHP va cuta o funcie cu acelai nume ori de cte ori variabila va fi evaluat i se va ncerca executarea ei. Aceasta poate fi utilizat pentru implementarea tabelelor de funcii, a tehnicilor de autentificare prin apelul emitentului etc. Variabilele funcii nu vor lucra cu construciile limbajului precum echo(), print(), unset(), isset(), empty(), include(), require() etc. Exemplul 1.30. Variabile funcii.
<?php function foo() { echo "In foo()<br />\n"; } function bar($arg = '') { echo "In bar(); argumentul era '$arg'.<br />\n"; } // Aceasta este o functie derulanta in jurul lui echo function echoit($string) { echo $string; } $func = 'foo'; $func(); // Aceasta apeleaza foo() $func = 'bar'; $func('test'); // Aceasta apeleaza bar() $func = 'echoit'; $func('test'); // Aceasta apeleaza echoit() ?>

Se poate, de asemenea, apela metoda unui obiect prin utilizarea variabilelor funcii. Exemplul 1.31. Exemplu de metode variabile.
<?php class Foo { function Variabile() { $name = 'Bar'; $this->$name(); // Aceasta apeleaza metoda Bar() } function Bar() { echo "This is Bar"; }

- 33 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor)


$foo = new Foo(); $funcname = "Variabile"; $foo->$funcname(); // Aceasta apeleaza metoda $foo->Variabile() ?>

7.
7.1.

Clase i obiecte Obiectul class

O clas este o colecie de variabile i funcii care lucreaz cu aceste variabile. O clas este definit prin utilizarea sintaxei urmtoare: Exemplul 1.32. Sintaxa de definire a unei clase.
<?php class Catalog { var $items; // Articole din catalogul magazinul nostru // Aduna $num articole la $artnr din catalogul nostru function add_item($artnr, $num) { $this->items[$artnr] += $num; } // Extrage $num articole din $artnr din catalogul nostru function remove_item($artnr, $num) { if ($this->items[$artnr] > $num) { $this->items[$artnr] -= $num; return true; } else { return false; } } } ?>

n scriptul de mai sus se definete o clas denumit Catalog care conine un array asociativ de articole din catalog i 2 funcii care adun i respectiv extrag articole din acest catalog. Avertisment Nu se poate despri definiia unei clase n mai multe fiiere sau blocuri PHP multiple. O astfel de definiie este greit i nu va fi acceptat:
Contra-Exemplu <?php class test { ?> <?php function test() { prin 'OK'; } } ?>

Observaie: PHP4 rezerv toate numele de funcii care ncep cu __ ca nume magice. Este recomandat s nu se utilizeze nume de funcii cu __ n PHP4 pentru a se evita unele efecte ale funciilor magice. - 34 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor) n PHP 4, numai iniializri constante sunt permise pentru variabilele var. Pentru a iniializa variabile cu valori non-constante, este necesar iniializarea unei funcii care este apelat automat cnd un obiect este construit din acea clas. O astfel de funcie este numit un constructor (vezi mai jos): Exemplul 1.33. Utilizarea funciei constructor.
<?php class Catalog { /* Nici una din acestea nu vor functiona in PHP 4. */ var $data_curenta = date("Y-m-d"); var $nume = $prenume; var $proprietar = 'Ion ' . 'Georgescu '; /* Array-uri care contin valori constant vor merge totusi. */ var $items = array("VCR", "TV"); } /* Acesta este modul corect de definire in PHP 4. */ class Catalog { var $data_curenta; var $nume; var $proprietar; var $items = array("VCR", "TV"); function Catalog () { $this->data_curenta = date("Y-m-d"); $this->nume = $GLOBALS['prenume']; /* etc. . . */ }

} ?>

Clasele sunt tipuri de date, adic sunt schie sau abloane ale adevratelor variabile. O variabil din tipul dorit se va crea cu operatorul new. Exemplul 1.34. Generare unei clase cu operatorul new.
<?php $catalog = new Catalog; $catalog ->add_item("10", 1); $alt_catalog = new Catalog; $alt_catalog ->add_item("0815", 3); ?>

Aceste declaraii creeaz obiectele $catalog i $alt_catalog, ambele din clasa Catalog. Funcia add_item() a obiectului $catalog este apelat pentru a aduga un exemplar la articolul cu numrul de catalog 10 din clasa $catalog. Trei exemplare din articolul cu numrul de catalog 0815 sunt adugate la $alt_catalog. Ambele, $catalog and $alt_catalog, au funcii add_item(), remove_item() i o variabil exemplar (item). Acestea sunt funcii i variabile distincte. Obiectele pot fi reprezentate mental ca fiind similare directoarelor dintr-un sistem de fiiere. ntr-un sistem de fiiere pot exista dou fiiere diferite README.TXT, atta timp ct ele sunt n directoare diferite. Aa cum, n cazul structurii arborescente a sistemelor de fiiere, trebuie precizat calea complet de acces pentru fiecare fiier ncepnd de la directorul rdcin (i.e. de la nivelul superior), tot aa trebuie specificat numele complet al unei funcii ce urmeaz a fi apelat. n limbajul PHP, directorul rdcin (de la nivelul superior) va fi numele spaiului global, iar - 35 -

Eugen ZAHARESCU CURS DE PHP(PHP Hypertext Preprocessor) separatorul cilor de acces va fi ->. Astfel, numele $catalog->items i $alt_catalog->items sunt dou nume de variabile diferite. A se observa c variabila se numete $catalog->items, i nu $catalog->$items, deoarece un nume de variabil n PHP este precedat de un singur $ (simbolul dolar). Exemplul 1.35. Utilizarea corect a identificatorilor de variabile din interiorul claselor.
<?php // corect, se utilizeaz un singur $ $catalog->items = array("10" => 1); // invalid, deoarece $catalog->$items devine $catalog->"" $ catalog ->$items = array("10" => 1); // corect, dar s-ar putea sa nu se obtina ceea ce s-a dorit: // $catalog->$myvar devine $catalog->items $myvar = 'items'; $catalog->$myvar = array("10" => 1); ?>

n cadrul definiiei unei clase, nu se va tii numele sub care obiectul va fi accesibil n program (e.g. n momentul n care clasa Catalog a fost definit, nu se tia c obiectul de va numi mai trziu $catalog sau $alt_catalog). Astfel, nu se poate scrie $catalog->items chiar n interiorul clasei Catalog. n schimb, n scopul de a accesa propriile sale funcii i variabile din cadrul unei clase, se poate utiliza pseudo-variabila $this care poate fi citit ca proprietatea mea sau obiectul_curent'. Astfel, $this->items[$artnr] += $num' poate fi citit ca adun $num la contorul $artnr al array-ului meu de exemplare (items) sau adun $num la contorul de exemplare $artnr ale array-ului din cadrul obiectului curent.

- 36 -

S-ar putea să vă placă și