+ All Categories
Home > Documents > 5350 (1)

5350 (1)

Date post: 08-Aug-2015
Category:
Upload: mihai-mike
View: 16 times
Download: 3 times
Share this document with a friend
32
Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor) - 5 - CAPITOLUL I Limbajul PHP (PHP Hypertext Preprocessor) 1. Introducere. Funcţionarea motorului PHP Definiţie 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 aplicaţiile bazate pe tehnologiile Web, inclusiv în aplicaţii de comerţ electronic. Exemplul 1.1. Trei scripturi elementare introductive ce conţin 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()">
Transcript
Page 1: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 5 -

CAPITOLUL I

Limbajul PHP (PHP Hypertext Preprocessor)

1. Introducere. Funcţionarea motorului PHP Definiţie 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 aplicaţiile bazate pe tehnologiile Web, inclusiv în aplicaţii de comerţ electronic. Exemplul 1.1. Trei scripturi elementare introductive ce conţin 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()">

Page 2: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 6 -

<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 mulţime de comenzi pentru a produce un HTML, se scrie un script HTML ce include cod pentru a realiza un obiectiv (în acest caz, a afişa un text). Codul PHP este delimitat de coduri de start şi de sfârşit (<?php…?>)ce îţi permit să intri şi să ieşi din "modul PHP".

Diferenţa dintre PHP şi alte limbaje cum ar fi JavaScript este aceea că PHP este executat pe server pe când JavaScript este executat pe calculatorul clientului (de către programul de navigare pe Internet). Dacă ar fi să ai un script similar cu cel de mai sus pe serverul tău, clientul ar primi doar rezultatele scriptului ce este rulat, fără a vedea în nici un fel codul din spatele acestuia. Se poate chiar configura serverul de web ca acesta să proceseze toate fişierele HTML cu PHP şi astfel încât nici un utilizator nu poate vedea ce există în fişierele 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 conţinut dinamic sau trimitere şi primire de cookie-uri.

Figura 1.1. Funcţionarea motorului PHP

Există trei domenii principale unde sunt folosite scripturile PHP.

1. Scripturi ce rulează pe server. Acesta este cel mai tradiţional ş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 fără 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.

Page 3: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 7 -

3. Scrierea de aplicaţii ce rulează pe partea clientului în mod grafic (GUI). Se pot folosi facilităţile avansate ale PHP-ului în aplicaţiile 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, incluzând Linux, multe variante de Unix (incluzând 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 putând 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 facilităţi în PHP o reprezintă suportul său pentru o gamă largă de baze de date. Scrierea unei pagini de web ce interacţionează cu o bază de date este simplă şi poate fi realizată pentru următoarele 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.

Funcţiile PHP pentru acces la bazele de date nu sunt standardizate. Aceasta conduce la necesitatea existenţei unei biblioteci de clase pentru baze de date care să ascundă diferenţele între API(Aplication Program Interface) ale diverselor servere de baze de date (i.e. să încapsuleze particularităţile implementărilor acestora) astfel încât interschimbul de informaţii privitoare la bazele de date şi conţinutul lor să se realizeze facil. O implementare care satisface aceste cerinţe 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 comerţului electronic, existând deja un mare arsenal de funcţii pentru plaţi on-line, funcţii de plată Cybercash, CyberMUT, VeriSign Payflow Pro şi CCVS.

Exemplul 1.2. Afişarea 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']; ?> Răspunsul va fi: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)

Page 4: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 8 -

Exemplul 1.3. Utilizarea structurii de control condiţionale IF şi a funcţiilor

<?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 />';} ?>

Răspunsul 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 } ?>

Răspunsul 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 construcţia:

< ?php ... ? >

Comentariile pot fi scrise în stilul comentariilor din limbajele C/C++ ori Perl

/* ... */ sau //. . . sau #. . .

Caracterul terminal Declaraţiile şi instrucţiunile se separă prin „;" ca şi în C, Perl sau Java

;

Page 5: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 9 -

Funcţionarea analizorului (motorului) PHP este următoarea: preprocesorul PHP va detecta construcţiile PHP delimitate între tag-urile <?php şi ?> şi le va interpreta, ignorând restul conţinutului documentului pe care îl va trimite, la ieşirea 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. Valori logice (boolean), 2. Numere întregi (integer), 3. Numere reale în virgulă mobilă (float, double, real) 4. Ş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 inhibându-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ă funcţie de valoarea pe care o stochează. Variabilele se pot folosi fără 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 câmpurile 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.). Observaţii:

Din motive de lizibilitate, au fost introduse trei pseudo-tipuri: mixed, number şi callback. Tipul double are aceeaşi semnificaţie cu cea a tipului float. Cele două denumiri coexistă doar

din motive "istorice". În PHP, de obicei, tipul unei variabile nu este specificat de către programator, ci este stabilit în

timpul execuţiei în funcţie 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 distincţie între literele mari şi

Page 6: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 10 -

literele mici). Există posibilitatea de a converti o variabilă de orice tip la tipul boolean. În momentul efectuării unei conversii, sunt convertite la valoarea FALSE următoarele valori:

numărul întreg 0; numărul real 0.0; şirul vid; şirul "0"; un vector fără nici un element; un obiect fără 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 logării într-o pagină de administrare. După ce se fac verificările, dacă utilizatorul este logat ca administrator, funcţia noastră pentru verificarea logării poate returna valoarea de adevăr (TRUE), dacă este logat sau valoarea contrară (FALSE) dacă nu este logat, şi astfel vom şti dacă să îi acordăm sau nu acces utilizatorului în secţiunea de administrare. Tipul integer

O variabilă de tip integer reprezintă o valoare din mulţimea numerelor întregi. Aceste numere pot fi specificate în baza 10, în baza 16 sau în baza 8, convenţiile fiind aceleaşi ca şi în limbajele C/C++ sau Java. Modul de reprezentare depinde de platforma utilizată; de obicei se foloseşte reprezentarea pe 32 de biţi. Interpretorul PHP nu oferă suport pentru numerele întregi fără semn. Trebuie remarcat faptul că în PHP nu există nici un operator pentru efectuarea de împărţiri întregi. De exemplu, rezultatul operaţiei 3/2 nu va fi numărul întreg 1 (ca în C/C++ sau Java), ci numărul real (float) 1.5 Şi pentru numerele întregi există posibilitatea efectuării de conversii:

Valoarea logică TRUE este convertită la valoarea întreagă 1;

Valoarea logică FALSE este convertită la valoarea întreagă 0;

Un număr real este convertit prin "rotunjire înspre 0". Aşadar, 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 luând în considerare doar primele caractere care conţin informaţii numerice. Aşadar ş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 conţin informaţii numerice, rezultatul conversiei va fi valoarea 0.

Tipul float

O variabilă de tip float poate fi specificată folosind fie forma zecimală, fie cea ştiinţifică (cu exponent). La fel ca şi în cazul tipului integer, precizia variabilelor de tipul float este dependentă de platforma utilizată. De obicei se foloseşte standardul IEEE 64. Există posibilitatea de a converti o variabilă de orice tip la tipul float. Pentru numerele reale se pot efectua următoarele conversii:

Page 7: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 11 -

Un şir de caractere este convertit luând în considerare doar primele caractere care conţin informaţii numerice; aşadar ş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 corespunzătoare.

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 către interpretor.

Literalii de tip şir de caractere pot fi specificaţi î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ă notaţie, pot fi specificate mai multe caractere speciale, pe lângă caracterele de la varianta anterioară, printre care:

a) sfârşit de linie ("\r")

b) rând nou ("\n")

c) tab orizontal ("\t")

d) semnul dolar ("\$")

e) ghilimelele duble ("\"")

f) secvenţe de caractere pentru specificarea expresiilor regulate în notaţie octală

("\[0-7]{1,3}")

g) secvenţe de caractere pentru expresiile regulate în notaţie 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".

Notaţia heredoc. Acest tip de notaţie a fost introdus la versiunea 4 a interpretorului PHP. Pentru a specifica un şir de caractere folosind această notaţie, 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 acelaşi identificator pe o altă linie, vor constitui valoarea şirului de caractere. De exemplu, instrucţiunea: $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.

Page 8: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 12 -

Pentru a accesa un anumit caracter din şirul de caractere, se foloseşte, 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ă concatenăm 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 următoarele conversii:

Valoarea logică TRUE va fi convertită la şirul "1", iar valoarea logică FALSE va fi convertita

la şirul vid (""); Un număr întreg va fi convertit la un şir de caractere care reprezintă valoarea numărului în baza

10; Un număr real va fi convertit la un şir de caractere care reprezintă notaţia ştiinţifică a acestuia; Obiectele sunt întotdeauna convertite la şirul "Object"; Variabilele de tipul resource sunt convertite la şirul "Resource id #n", unde n reprezintă un

număr unic ataşat resursei respective de către 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 = conţine o serie de variabile ale căror valori sunt setate de server-ul web; majoritatea valorilor variabilelor din acest vector depind de mediul de execuţie al script-ului curent.

$_GET şi $_POST conţin 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 câmpurilor dintr-un formular care a fost completat şi transmis folosind una dintre cele două metode.

$_COOKIE conţine valorile variabilelor care cuprind informaţii referitoare la cookie-urile păstrate pe calculatorul utilizatorului ce accesează pagina Web.

$_FILES conţine variabile primite de script prin intermediul încărcărilor de fişiere prin metoda post.

$_ENV conţine variabile disponibile prin intermediul mediului în care este executat.

$_REQUEST conţine variabile disponibile prin intermediul oricărui tip de mecanism cu ajutorul căruia utilizatorul poate introduce date.

$_SESSION conţine variabile care corespund sesiunii curente a script-ului.

Tipul array Vectorii în PHP sunt mulţimi formate din chei. Fiecărei chei din vector i se ataşează o valoare. Acest tip de date este optimizat astfel încât să poată fi folosit în locul următoarelor structuri de date: liste, tabele de dispersie, dicţionare, colecţii, stive, cozi şi altele.

Datorită faptului că o valoare poate fi chiar un alt vector, se pot simula foarte uşor arborii n-dimensionali sau tablourile n-dimensionale. Valoarea unei variabile de tip vector se poate specifica folosind construcţia:

array (cheie => valoare, cheie => valoare, ...)

Page 9: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 13 -

De exemplu, următoarea instrucţiune PHP va construi un vector cu două elemente, dintre care unul este de tip string, iar celălalt 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 ataşată 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 ataşată cheii 0. De exemplu, următoarele două instrucţiuni sunt echivalente:

array(5 => 43, 32, 56, 'b' => 12); array(5 => 43, 6 => 32, 7 => 56, 'b' => 12);

Dacă se foloseşte valoarea logică TRUE ca şi cheie, atunci aceasta va fi convertită la cheia de tip întreg 1, iar valoarea FALSE va fi convertită la numărul î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 instrucţiunea: $a["x"] = 42;

adaugă în vectorul $a valoarea 42 ataşată cheii "x".

Dacă se foloseşte un vector care nu a fost definit anterior, atunci acesta este creat automat. Aşadar printr-o instrucţiune 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 numărul întreg 5, iar valoarea sa va fi 42.

De asemenea, există posibilitatea de a crea un element nou fără a-i preciza cheia. Sintaxa are forma :

$vector[] = valoare;

Aceasta instrucţiune are ca efect adăugarea unui element a cărui cheie este un număr întreg mai mare cu 1 decât cel mai mare număr î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, următoarele două secvenţe 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 numărul întreg 0, iar valoarea este cea a variabilei convertite.

Dacă se converteşte un obiect (variabilă de tip object), atunci vectorul rezultat va conţine câte un element pentru fiecare variabilă membru a obiectului. Cheile elementelor vor fi date de denumirile

Page 10: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 14 -

proprietăţilor obiectului (variabilele membru ale obiectului), iar valorile elementelor vor fi valorile proprietăţilor obiectului.

Dacă realizăm o conversie a unei variabile de tip NULL, atunci rezultatul va fi un vector vid (care nu conţine nici un element).

În continuare sunt prezentate câteva exemple care descriu mai detaliat posibilităţile oferite de folosirea vectorilor în PHP.

Pentru început, iată un vector ale cărui 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 adăuga şi alte elemente care să reprezinte diferite alte proprietăţi. De exemplu, am putea avea nevoie de o valoare suplimentară căreia nu dorim să îi atribuim nici un nume de identificare (cheie). Pentru ca vectorul să conţină 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 numărul întreg 0 deoarece nu există nici o

altă cheie care este număr întreg. <?php $v['denumire'] = 'portocala'; $v['familie'] = 'citrice'; $v['culoare'] = 'portocaliu'; $v['forma'] = 'rotunda'; $v['gust'] = 'dulce'; $v[] = 4;

Page 11: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 15 -

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

Scriptul 1.2. “array2.php” - O alternativa de construire a aceluiaşi vector « v » cu acelaşi 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 căror elemente sunt alte array-uri. Tipul object

Pentru a defini un obiect care poate fi folosit pentru afişarea mesajului “Salutare lume!”, se scrie următoarea secvenţă:

<?php class Salutare { function AfiseazaSalutare() { echo 'Salutare lume!'; } } $a = new Salutare; echo $a -> AfiseazaSalutare();

Page 12: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 16 -

?>

Scriptul 1.4. “clasa.php” – Definirea unui obiect elementar cu o singură metodă Se observă faptul că este afişat textul “Salutare lume!”, text ce l-am introdus în funcţia AfiseazaSalutare(). Pentru a utiliza o variabila de tip obiect, va trebui să realizăm o instanţiere a obiectului prin intermediul instrucţiunii new. Sintaxa ei este:

$a = new Salutare

Astfel, variabila $a devine un obiect ale cărui metode pot fi utilizate. Pentru afişarea propriu-zisă a mesajului va trebui să executăm metoda AfiseazaSalutare() printr-o instrucţiune 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 instanţe a clasei stdClass.

Dacă variabila are tipul NULL, atunci noua instanţă va fi vidă. În toate celelalte cazuri, instanţa va conţine o variabilă membru numită scalar a cărei valoare va fi cea a variabilei convertite.

Pentru conversii se folosesc instrucţiuni de tipul $obiect = (object) "Salutare lume!". După realizarea conversiei, se poate tipări mesajul “Salutare lume!” folosind instrucţiunea echo $obiect->scalar;

Tipul resource

Variabilele de tip resource sunt folosite pentru păstrarea unor referinţe către anumite resurse externe cum ar fi conexiuni la baze de date, fişiere, etc. Resursele sunt create şi utilizate de anumite funcţii 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ă oricărei variabile care nu a fost încă iniţializată. 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 iniţializată;

Page 13: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 17 -

a fost deziniţializată (prin intermediul funcţiei unset () ).

Constantele pot fi considerate variabile ale căror 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 construcţia sau funcţia define( ). Numele constantelor va fi scris, de obicei cu majuscule. Aceasta opţiune 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 faţa 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 dispoziţie un set impresionant de operatori. Aceşti operatori sunt cei disponibili în limbaje precum C sau Perl. Categoriile importante de operatori sunt:

Operatorii aritmetici (+, -, *, /, %) sunt cei cunoscuţi din clasicele limbaje C/C++, Java, etc.

Operatorii aritmetici Exemple Nume Rezultat

$a + $b Adunare Suma lui $a cu $b. $a - $b Scădere Diferenţa dintre $a şi $b. $a * $b Înmulţire Produsul lui $a cu $b. $a / $b Împărţire Câtul împărţirii lui $a la $b. $a % $b Modulo Restul împărţirii 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; ?>

Page 14: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 18 -

Operatorii la nivel de bit (&,|,^, ~, <<, >>) ,

Operatorii la nivel de bit Exemple Nume Rezultat

$a & $b And Biţii setaţi la 1 în $a şi în $b vor fi setaţi la 1. („şi” bit cu bit) $a | $b Or Biţii setaţi la 1 fie $a, fie în $b vor fi setaţi la 1. („sau” bit cu bit) $a ^ $b Xor Biţii setaţi 1 fie $a, fie în $b dar nu simultan vor fi setaţi 1. („sau exclusiv”) ~ $a Not Biţii setaţi la 1 în $a, vor fi resetaţi la 0, şi vice versa. („not” bit cu bit) $a << $b Shift left Deplasează $b poziţii spre stânga biţii lui $a. $a >> $b Shift right Deplasează $b poziţii spre dreapta biţii lui $a.

Operatorii relaţionali (ca noutate se poate menţiona aici „===" care are ca rezultat constanta TRUE dacă operanzii au valori identice şi în plus sunt de acelaşi tip)

Operatorii relaţionali Exemple Nume Rezultat

$a == $b Egalitate TRUE dacă $a este egal cu $b. $a === $b Identitate TRUE dacă $a este egal cu $b şi sunt de acelaşi tip. (PHP 4) $a != $b Diferit TRUE dacă $a nu este egal cu $b. $a <> $b Diferit TRUE dacă $a nu este egal cu $b. $a !== $b Non-identitate TRUE dacă $a nu este egal cu $b sau nu sunt de acelaşi tip. (PHP 4) $a < $b Mai mic decât TRUE dacă $a este strict mai mic decât $b. $a > $b Mai mare decât TRUE dacă $a este strict mai mare decât $b. $a <= $b Mai mic sau egal cu TRUE dacă $a este mai mic sau egal cu $b. $a >= $b Mai mare sau egal cu TRUE dacă $a este mai mare sau egal cu $b.

Un alt operator condiţional este operatorul terţiar "? :". 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 condiţional terţiar "?:". Structura (expr1) ? (expr2) : (expr3)

<?php //Operator condiţional 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 apărea în cadrul expresiei pe care o prefixează),

Page 15: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 19 -

Operatori de incrementare / decrementare („++” şi „—”)

Operatori de incrementare / decrementare Exemple Nume Rezultat

++$a Pre-increment Incrementează $a cu 1, apoi întoarce $a. $a++ Post-increment Întoarce $a, apoi incrementează $a cu 1. --$a Pre-decrement Decrementează $a cu 1, apoi întoarce $a. $a-- Post-decrement Întoarce $a, apoi decrementează $a cu 1.

Operatori logici (and sau „&&", or sau „| |", xor, „!")

Operatori logici Exemple Nume Rezultat

$a and $b And TRUE dacă ambele $a şi $b sunt TRUE. $a && $b And TRUE dacă ambele $a şi $b sunt TRUE. $a or $b Or TRUE dacă fie $a sau $b sunt TRUE. $a || $b Or TRUE dacă fie $a sau $b sunt TRUE. $a xor $b Xor TRUE dacă fie $a, fie $b sunt TRUE, dar nu simultan ambele. ! $a Not TRUE dacă $a nu este TRUE.

Operatori pentru şiruri de caractere Se defineşte 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 stângă, 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. Instrucţiunile limbajului PHP Instrucţiunile limbajului PHP sunt cele uzuale din alte limbaje de programare. Sunt disponibile instrucţiuni de atribuire (de forma $variabilă = expresie), instrucţiuni de test (if şi switch), instrucţiuni repetitive (while, do, for, foreach) şi instrucţiuni de control (break, continue, return).

Page 16: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 20 -

5.1. Structuri condiţionale

5.1.1. Instrucţiunea if

<?php if (expresie) instrucţiune ?>

Mai întâi, expresie (de tipul boolean) este evaluată la valoarea ei logică. Dacă expresie este evaluată la valoarea TRUE, atunci PHP va executa instrucţiune iar dacă expresie este evaluată la valoarea FALSE atunci PHP va ignora instrucţiune. 5.1.2. Instrucţiunea else

Instrucţiunea 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. Instrucţiunea elseif

Instrucţiunea elseif este o combinaţie de if and else. Precum else, extinde o instrucţiune if pentru a executa o alta instrucţiune diferită în cazul în care expresia logică originală if este evaluată la FALSE. Totuşi, spre deosebire de else, ramura alternativă va fi executată dacă şi numai dacă expresia condiţională elseif este evaluată la TRUE. Exemplul 1.9. Utilizarea structurii condiţionale 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 aceeaşi instrucţiune 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 acelaşi comportament, identic ca şi în cazul lui 'elseif' (într-un singur cuvânt). 5.1.4. Instrucţiunea switch

Instrucţiunea switch este asemănătoare cu o serie de instrucţiuni if cu aceeaşi expresie logică. În multe situaţii, se doreşte compararea aceleiaşi variabile (sau expresii) cu mai multe valori diferite şi

Page 17: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 21 -

să se execute secvenţe diferite de cod depinzând de valoarea ei la un moment dat. Instrucţiunea structurată switch a fost proiectată tocmai pentru acest lucru.

Notă: Spre deosebire de alte limbaje de programare, instrucţiunea continue se aplică şi acţionează similar cu break. Dacă există un switch în interiorul unui ciclu şi se doreşte să se continue cu următoarea iteraţie a ciclului exterior, se va utiliza continue 2.

Următoarele 2 exemple ilustrează două modalităţi de a scrie acelaşi lucru: una prin utilizarea unei cascade de instrucţiuni if şi elseif, şi alta prin utilizarea instrucţiunii switch:

Exemplul 1.10. Utilizarea structurii condiţionale „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 greşelile este important de înţeles cum este executată instrucţiunea switch. Instrucţiunea switch se execută linie cu linie (de fapt, instrucţiune cu instrucţiune). La început, nu se execută nici un cod. Numai când se întâlneşte o instrucţiune case cu o valoare care se potriveşte valorii expresiei switch atunci PHP începe într-adevăr să execute instrucţiunile alternativei respective. PHP va continua să execute instrucţiunile până la sfârşitul blocului switch, sau până la prima apariţie a instrucţiunii break. Dacă nu se adaugă o instrucţiune break la sfârşitul listei de instrucţiuni case, PHP va continua să execute instrucţiunile următoarei alternative case. Exemplul 1.11. Utilizarea structurii condiţionale „switch..case” fără break

<?php //Fara break la sfârsitul 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:

Page 18: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 22 -

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

În acest exemplu, dacă $i este egal cu 0, PHP ar executa toate instrucţiunile echo. Dacă $i este egal cu 1, PHP ar executa ultimele 2 instrucţiuni echo. Comportamentul dorit se obţine numai dacă $i este egal cu 2 (i.e. va fi afişat textul 'i este egal cu 2'). De aceea este important să nu se uite inserarea instrucţiunilor break în structura de ramificare multiplă switch.

Într-o instrucţiune switch, condiţia este evaluată numai o dată şi rezultatul este comparat cu fiecare instrucţiune case. Într-o instrucţiune elseif, condiţia este evaluată din nou. Dacă condiţia este mai complicată decât o simplă comparaţie şi/sau se află într-un ciclu foarte strâns, o instrucţiune switch poate fi mai rapidă.

Lista de instrucţiuni pentru un case poate fi de asemenea vidă, ceea ce face să treacă controlul spre lista de instrucţiuni a următorului case. Exemplul 1.12. Utilizarea structurii condiţionale „switch..case” cu alternative vide

<?php //Structura case cu alternative vide... $i=0; switch ($i) { case 0: case 1: case 2: echo "i este mai mic decat 3 dar nu negativ"; break; case 3: echo "i este 3"; } ?>

O situaţie specială o reprezintă alternativa case denumită default. Această alternativă corespunde oricăror altor cazuri care nu s-au potrivit celorlalte alternative case şi trebuie să fie ultima instrucţiune (alternativă) case. Exemplul 1.13. Utilizarea structurii condiţionale „switch..case” cu alternativa default <?php //Structura case cu alternativa default... $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";

Page 19: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 23 -

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 decât dacă ele sunt redefinite ca tipuri simple. Se pot utiliza şi alte sintaxe, alternative, pentru structurile de control ale ramurilor instrucţiunii structurate switch: Exemplul 1.14. Utilizarea structurii condiţionale „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. Instrucţiunea 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 instrucţiuni while este:

while (expresie) instrucţiune;

Instrucţiunea while determină PHP să execute instrucţiunile incluse în mod repetat, atâta timp cât expresia while este evaluată la valoarea TRUE. Valoarea expresiei este verificată de fiecare dată la începutul ciclului, astfel încât chiar dacă această valoare se modifică în timpul execuţiei instrucţiunilor incluse, execuţia nu se va opri până la sfârşitul iteraţiei (rularea tuturor instrucţiunilor din cadrul ciclului). Atunci când expresia while este evaluată la valoarea FALSE de la început, instrucţiunile din cadrul ciclului nu vor fi executate nici măcar o dată.

Ca şi în cazul instrucţiunii if, se pot grupa mai multe instrucţiuni în cadrul aceleiaşi instrucţiuni repetitive while prin încadrarea lor cu paranteze acoladă {…} sau prin utilizarea sintaxei alternative:

Page 20: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 24 -

while (expr): instrucţiune ... endwhile;

Exemplele următoare sunt identice şi ambele afişează 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. Instrucţiunea do..while

Ciclurile do..while sunt foarte asemănătoare ciclurilor while, cu excepţia faptului că expresia logică este verificată la sfârşitul fiecărei iteraţii şi nu la începutul ei. Principala diferenţă faţă de ciclurile while obişnuite este că prima iteraţie a ciclului do..while se execută întotdeauna (pentru că expresia logică este verificată de abia la sfârşitul ciclului). Acest comportament nu se întâlneşte şi la ciclurile while obişnuite (pentru că expresia logică este verificată la începutul fiecărei iteraţii iar dacă este evaluată la valoarea FALSE atunci execuţia 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 iteraţie, expresia logică este evaluată la valoarea FALSE ($i nu este mai mare decât 0). Programatorii în C experimentaţi utilizează uneori în mod diferit ciclul do..while, permiţând întreruperea execuţiei în mijlocul blocului de instrucţiuni, prin construirea unui ciclu infinit do..while şi includerea instrucţiunii break precum în exemplul următor (1):

Exemplul 1.16. Utilizarea structurii repetitive „do..while(1) ca un ciclu infinit”

<?php // ciclu infinit do..while (1) $factor=2;

Page 21: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 25 -

$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. Instrucţiunea for

Ciclurile for sunt cele mai complexe cicluri în PHP. Se comportă precum ciclul corespunzător din C. Sintaxa ciclului for este:

for (expr1; expr2; expr3) {instrucţiune};

Prima expresie (expr1) este evaluată (executată) cel puţin o dată în mod necondiţionat la începutul ciclului. La începutul fiecărei iteraţii, expr2 este evaluată. Dacă este evaluată la TRUE, ciclul continuă şi instrucţiunile incluse sunt executate. Dacă în schimb este evaluată la FALSE, execuţia ciclului se termină. La sfârşitul fiecărei iteraţii, 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 când se doreşte terminarea ciclului prin utilizarea unei instrucţiuni condiţionate break în locul expresiei logice a lui for. Toate exemplele următoare vor afişa numerele de la 1 la 10:

Exemplul 1.17. Utilizarea structurii repetitive „for”. Generarea/afişarea secvenţei de numere 1..10.

<?php // Generarea/afişarea secvenţei de numere 1..10 echo ”<br/> Exemplul 1 : ”; for ($i = 1; $i <= 10; $i++) { echo $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,” ”;

Page 22: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 26 -

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

PHP permite de asemenea varianta alternativă a ciclului for prin utilizarea "sintaxei caracterului:"

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

<?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. Instrucţiunea foreach

PHP 4 sau 5 (nu şi PHP 3) includ o construcţie foreach, foarte asemănătoare 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 când se va încerca utilizarea unei variabile de un alt tip de dată sau a unei variabile neiniţializate.

Există 2 sintaxe a acestui ciclu:

foreach (expresie_array as $value) instrucţiune foreach (expresie_array as $key => $value) instrucţiune

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 încât în următorul ciclu se va face referire la următorul element al array-ului). A

Page 23: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 27 -

doua formă se comportă similar, doar că indexul elementului curent se va asocia variabilei $key la fiecare ciclu.

Observaţii:

Când foreach începe execuţia 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 execuţiei niciunui ciclu foreach.

Ciclul foreach lucrează pe o copie a array-ului specificat şi nu pe array-ul însuşi. De aceea, pointerul array-ului nu este modificat precum în construcţia each() şi orice modificare efectuată asupra elementelor din array nu se reflectă în array-ul originar. Totuşi, pointerul intern al array-ului originar este incrementat pe parcursul procesării array-ului. La sfârşitul unei procesări complete pointerul intern al array-ului va indica ultimul element din tablou.

Ciclul foreach nu poate suprima mesajele de eroare prin utilizarea lui '@'.

Următoarele structuri funcţionează 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 />"; } ?>

Următoarele structuri funcţionează, 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 */

Page 24: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 28 -

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. Instrucţiunea break

Instrucţiunea break termină execuţia structurii curente din cadrul instrucţiunilor structurate for, foreach, while, do..while sau switch. Instrucţiunea break acceptă şi un argument numeric opţional care comunică câte structuri incluse, imbricate, vor fi anulate sau desfăcute prin terminarea execuţiei 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 />";

Page 25: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 29 -

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. Instrucţiunea continue

Aceasta instrucţiune este folosită pentru a întrerupe execuţia secvenţei de instrucţiuni din interiorul unui ciclu şi trecerea la următoarea iteraţie. În cazul instrucţiunii for, înainte de următoarea iteraţie se evaluează (execută) expresia de incrementare (expresia nr_3 din sintaxa generală). La fel ca şi în cazul instrucţiunii break, poate apărea un argument care indică numărul structurilor imbricate asupra cărora are efect. Exemplul următor realizează afişarea elementelor unui şir de numere întregi care sunt mai mari decât 1000:

foreach($a as $v) { if($v <= 1000) continue; echo $v; }

Scriptul 1.6. “continue1.php” – Afişarea selectivă a elementelor care depăşesc 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"; } ?>

Page 26: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 30 -

Scriptul 1.7. “continue.php” –efectul folosirii argumentelor pentru instrucţiunea 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 înstrucţiuni if scrisă cu sintaxa alternativă. Blocul HTML va fi afişat numai dacă $a este egal cu 5. Sintaxa alternativă se aplică şi structurii else and elseif în egală măsură. În exemplul următor 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 afişare a sumei valorilor unui tablou unidimensional (vector), prin utilizarea variabilelor de tip întreg şi tablou indexat, a instrucţiunilor for şi foreach a operatorilor relaţionali, de asignare şi de incrementare (funcţia predefinită echo( ) afişează la ieşirea standard - aici fereastra navigatorului Web - codul HTML generat):

Page 27: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 31 -

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, utilizând 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. Funcţii definite de utilizator

O funcţie poate fi definită prin utilizarea următoarei sintaxe: Exemplul 1.24. Pseudo code care ilustrează definirea şi utilizarea funcţiilor.

<?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 funcţii, chiar şi alte funcţii şi definiţii de obiecte (class). În PHP 3, funcţiile trebuiau să fi definite înainte de apelul lor. Aceste restricţii au fost eliminate pentru PHP 4 şi PHP 5. Face excepţie cazul în care o funcţie este definită condiţional ca în exemplul de mai jos. Când o funcţie este definită într-o manieră condiţională definiţia sa trebuie să fie procesată înaintea apelului său. Exemplul 1.25. Funcţii condiţionale.

<?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"; } ?>

Page 28: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 32 -

Exemplul 1.26. Funcţii imbricate în interiorul altor funcţii.

<?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 funcţii

Valorile sunt returnate prin utilizarea instrucţiunii opţionale return. Orice tip de date poate fi returnat, incluzând liste şi obiecte. Această instrucţiune determină funcţia să-şi termine execuţia sa imediat şi să cedeze controlul înapoi liniei de program de unde ea a fost apelată.

Exemplul 1.27. Utilizarea instrucţiunii return()

<?php function square($num) { return $num * $num; } echo square(4); // Afisează '16'. ?>

Nu se pot returna valori multiple dintr-o funcţie, dar rezultate similare pot fi obţinute prin returnarea unei liste.

Exemplul 1.28. Returnarea unui array pentru a obţine 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 funcţie, trebuie să se utilizeze operatorul referenţial & atât în antetul de declarare a funcţiei cât şi atunci când se asociază valorile returnate unei variabile:

Exemplul 1.29. Returnarea unei referinţe dintr-o funcţie.

<?php

Page 29: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 33 -

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

6.2. Variabile funcţii

PHP implementează conceptul de variabile funcţii. Aceasta înseamnă că dacă numele unei variabile este încadrat de paranteze, PHP va căuta o funcţie cu acelaşi nume ori de câte ori variabila va fi evaluată şi se va încerca executarea ei. Aceasta poate fi utilizată pentru implementarea tabelelor de funcţii, a tehnicilor de autentificare prin apelul emitentului etc. Variabilele funcţii nu vor lucra cu construcţiile limbajului precum echo(), print(), unset(), isset(), empty(), include(), require() etc.

Exemplul 1.30. Variabile funcţii.

<?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 funcţii.

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"; } }

Page 30: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 34 -

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

7. Clase şi obiecte

7.1. Obiectul class O clasă este o colecţie de variabile şi funcţii care lucrează cu aceste variabile. O clasă este definită prin utilizarea sintaxei următoare:

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 defineşte o clasă denumită Catalog care conţine un array asociativ de articole din catalog şi 2 funcţii care adună şi respectiv extrag articole din acest catalog.

Avertisment Nu se poate despărţi definiţia unei clase în mai multe fişiere sau blocuri PHP multiple. O astfel de definiţie este greşită şi nu va fi acceptată:

Contra-Exemplu <?php class test { ?> <?php function test() { prin 'OK'; } } ?>

Observaţie: PHP4 rezervă toate numele de funcţii care încep cu __ ca nume magice. Este recomandat să nu se utilizeze nume de funcţii cu __ în PHP4 pentru a se evita unele efecte ale funcţiilor magice.

Page 31: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 35 -

În PHP 4, numai iniţializări constante sunt permise pentru variabilele var. Pentru a iniţializa variabile cu valori non-constante, este necesară iniţializarea unei funcţii care este apelată automat când un obiect este construit din acea clasă. O astfel de funcţie este numită un constructor (vezi mai jos):

Exemplul 1.33. Utilizarea funcţiei „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 schiţe sau şabloane ale adevăratelor 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 declaraţii creează obiectele $catalog şi $alt_catalog, ambele din clasa Catalog. Funcţia add_item() a obiectului $catalog este apelată pentru a adăuga un exemplar la articolul cu numărul de catalog 10 din clasa $catalog. Trei exemplare din articolul cu numărul de catalog 0815 sunt adăugate la $alt_catalog. Ambele, $catalog and $alt_catalog, au funcţii add_item(), remove_item() şi o variabilă exemplar (item). Acestea sunt funcţii şi variabile distincte.

Obiectele pot fi reprezentate mental ca fiind similare directoarelor dintr-un sistem de fişiere. Într-un sistem de fişiere pot exista două fişiere diferite README.TXT, atâta timp cât ele sunt în directoare diferite. Aşa cum, în cazul structurii arborescente a sistemelor de fişiere, trebuie precizată calea completă de acces pentru fiecare fişier începând de la directorul rădăcină (i.e. de la nivelul superior), tot aşa trebuie specificat numele complet al unei funcţii ce urmează a fi apelată.

În limbajul PHP, directorul rădăcină (de la nivelul superior) va fi numele spaţiului global, iar

Page 32: 5350 (1)

Eugen ZAHARESCU – CURS DE PHP(PHP Hypertext Preprocessor)

- 36 -

separatorul căilor de acces va fi „->”. Astfel, numele $catalog->items şi $alt_catalog->items sunt două nume de variabile diferite. A se observa că variabila se numeşte $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 definiţiei 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 târziu $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 funcţii ş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”.


Recommended