Aplicatii server – side limbajul PHP
Variabile
Taguri PHP, instructiuni, punct si virgula
Afisarea textului in PHP
In multe din scripturile scrise de incepatori (si nu numai) continutul rezultat in urma executiei este un text (de obicei in format HTML). Pentru a obtine acest text, secventele de cod trebuie sa contina instructiuni explicite care sa "spuna" intrepretorului ce anume trebuie afisat.
Instructiunile de afisare sunt print, echo si printf. Primele doua sunt echivalente si fac acelasi lucru (exista unele diferente de forma, vezi exemplul de mai jos, dar poate fi folosita oricare dintre ele); printf este folosita mai rar datorita sintaxei oarecum greoaie.
<?php # cele 2 instructiuni de mai jos sunt echivalente print "Text"; echo "Text"; # o singura instructiune echo poate primi mai multi parametri, separati prin virgula echo "<br />", "Afisez", " un text din ", 4, " bucati"; # o singura intstructiune print poate primi doar unul print "<br />"; print "Afisez"; print " un text din "; print 4; print " bucati"; # printf este folosita pentru a formata continutul, la fel ca in C/C++ printf( "<br />Am %4.2f lei", 102.123456 ); // afiseaza Am 102.12 lei ?>
Ce afiseaza PHP?
Rezultatul unui script PHP este de cele mai multe ori un text simplu in format HTML. Cu alte cuvinte, in majoritatea cazurilor PHP returneaza o pagina HTML ce va fi afisata in browser. La inceput, acest lucru poate genera confuzii, intrucat sursa HTML este diferita de ceea ce se afiseaza efectiv in browser.
Spre exemplu, fie urmatoarea secventa de cod:
<?php print "Salut"; print "Acesta este un script simplu"; ?>Probabil v-ati astepta ca rezultatul sa fie un text afisat pe 2 linii. Salvand aceasta secventa intr-un fisier PHP si accesandu-l prin intermediul unui web-server, veti observa ca rezultatul este urmatorul:
SalutAcesta este un script simpluDesi este confuz, rezultatul este corect. Codul PHP afiseaza doar caracterele care i-au fost indicate. Sfarsitul de linie reprezinta un caracter separat, ne-printabil, dar care controleaza cum apare textul pe ecran. In cazul nostru, nu s-a transmis acest caracter (numit si new-line) si prin urmare PHP nu l-a afisat.
Sa rescriem exemplul de mai sus pentru a se afisa si caracterul "sfarsit de linie"
<?php print "Salut"; print "\n"; # se afiseaza caracterul "new-line" care determina trecerea la un rand nou # randul nou va fi afisat in textul trimis catre browser print "Acesta este un script simplu"; ?>Verificand iar in browser veti constata ca nu s-a schimbat nimic. La prima vedere. In realitate rezultatul este afisat pe 2 linii, in textul trimis de PHP catre browser. Intrucat pagina este interpretata ca fiind HTML, browserul ignora caracterele new-line. Pentru verificare vizualizati sursa paginii (meniul View din browser -> view source).
Pentru a ajunge la rezultatul dorit (acela de a afisa un text pe 2 linii in pagina) trebuie folosita urmatoarea secventa:
<?php print "Salut"; print "\n"; # se afiseaza caracterul "new-line" care determina trecerea la un rand nou # randul nou va fi afisat in textul primit de browser (vizibil in sursa HTML) print "<br>"; # se afiseaza tagul BR ce va fi interpretat de browser ca 'linie noua' # linia noua va fi afisata in pagina finala HTML dupa ce este interpretata de # browser si nu are nici o legatura cu \n print "Acesta este un script simplu"; ?>Sursa paginii arata in felul urmator:
Salut <br>Acesta este un script simpluIn browser tagul BR este interpretat ca sfarsit de linie (line break). Caracterul "new-line" afisat de noi (inprint "\n") este ignorat oricum in HTML. Rezutatul, asa cum se vede in fereastra browser-ului:
Salut Acesta este un script simplu
Nota: Este foarte important sa se inteleaga diferenta dintre ceea ce se returneaza in urma executiei unui script PHP si ceea ce se afiseaza propriu-zis in browser. Pe scurt, PHP printeaza cod HTML care este afisat diferit de browsere.
De asemenea, trebuie inteles faptul ca functia print nu afiseaza textul pe mai multe linii daca nu se specifica acest lucru in mod express. Spre exemplu fie urmatoare secventa de cod:
<?php print "1"; print "2"; print "3"; ?>Rezultatul va fi
123
S-a afisat doar ce s-a indicat, 3 caractere, pe o singura linie, fara spatii.
Un alt lucru important de retinut este faptul ca odata printat, un text nu mai poate fi "sters". Nu exista "undo" pentru un print. Se poate captura intregul continut ce se transmite la finalul executiei, dar nu se poate altera textul afisat de o instructiune print anume.
Intelegand aceste aspecte va va fi mai usor in lucrul cu PHP si in modul in care verificati rezultatele scripturilor voastre.
Siruri de caractere
In majoritatea scripturilor PHP se lucreaza cu bucati de text denumite siruri de caractere sau string-uri. Sirurile de caractere reprezinta expresii (entitati ce au/returneaza o valoare) si pot fi folosite, la afisare, in atribuiri, la verificari, etc.
In limbajul PHP, sirurile de caractere pot fi delimitate de ghilimele duble, ghilimele simple sau printr-o notatie speciala folosind operatorul <<< (numit heredoc).
<?php print "Salut, straine! "; // sir simplu, delimitat de ghilimele duble print 'Salut din nou! '; // sir simplu, delimitat de apostrof // sir delimitat prin notatia speciala heredoc print <<<SIR Salut iar! SIR; ?>
Nota: in acest exemplu nu este nici o diferenta intre modul de definire a sirurilor - toate cele 3 stringuri afisate sunt echivalente, indiferent ca au fost delimitate prin ghilimele, apostrof sau operatorul heredoc. Cu toate astea, PHP trateaza in mod diferit aceste moduri de delimitare. Mai multe explicatii si exemple sunt prezentate in pagina Operatii cu siruri.
Comentarii in PHP
Comentariile sunt portiuni de cod care nu se executa. Sunt folosite de programatori de regula pentru a da diverse explicatii despre logica aplicatiei, variabile si altele. Comentariile nu afecteaza executia unui script si pot fi sterse din cod fara nici un efect.
<?php // acesta este un comentariu. intreaga linie nu va fi luata in considerare (doar o linie) // print "hello"; // linia de mai sus nu se executa # la fel ca mai sus # print "hello"; # nu se executa /* comentariu cu delimitator de inceput si sfarsit se poate intinde pe oricate linii; se termina la intalnirea marcajului de sfarit */ print /* partea asta e ignorata */ "Salut!"; /* afiseaza Salut! */ ?>Nota: comentariile /* */ nu pot fi imbricate (inserate unele in altele). Exemplul urmator nu este un cod valid.
<?php // exemplu gresit de comentariu PHP /* comentariu /* altul */ inapoi la primul */ ?>
Este un lucru foarte util sa folositi comentarii in cod pentru a explica modul de rezolvare a problemei abordate, sau pentru a da detalii despre operatiile efectuate. Acestea va vor ajuta mai tarziu daca veti vrea sa modificati codul scris, sau vor oferi altor persoane informatii (valoroase) despre cum ati gandit codul respectiv.
Variabile in PHP
Ce sunt variabilele?
Variabilele sunt elemente ce au o anumita valoare la un moment dat. Valoare unei variabile se poate schimba de-a lungul executiei unui script.
Lucrul cu variabile in PHP este foarte usor. Nu trebuie specificat un tip pentru ele (de genul "variabila text", "variabila numerica") ci acesta este determinat in mod automat.
Variabilele sunt diferentiate de celelalte elemente ale limbajului prin caracterul $. Astfel, o variabila are forma $nume. Numele variabilei poate fi orice identificator valid (un text ce contine doar litere, cifre si underscore, fara spatii sau alte caractere; un identificator nu poate incepe cu o cifra).
Declararea variabilelor
In PHP declararea variabilelor se realizeaza in acelasi timp cu initializarea lor (cu atribuirea unei valori de inceput). Atribuirea unei valori se realizeaza cu ajutorul instructiunii de atribuire ce are forma <nume variabila> = <valoare>;
// variabile numerice $variabila = 1; $numar = 0; // variabile text (stringuri) $text = "Salut"; $text2 = 'Ce faci?'; // variabile logice (boolean) $stiuPHP = true; $uitRepede = false; // vector $vectorGol = array(); $vectorS = array( 10,11,12,13 ); // vector simplu // vector asociativ $vector = array( 'luni' => 'Monday', 'marti' => 'Tuesday', 'miercuri' => 'Wednesday' ); // definirea unei noi componente a unui vector asociativ $vector[ 'joi' ] = 'Thursday'; // vector simplu definit ca asociativ, echivalentul lui $vectorS $vectorS2 = array( 0 => 10, 1 => 11, 2 => 12, 3 => 13 );
Nota: un vector asociativ se diferentiaza de unul normal prin faptul ca are chei alfa-numerice (cuvinte).
Atentie: PHP face distinctie intre literele mari si mici. Astfel, cele 3 variabile de mai jos sunt TOTAL diferite:
$variabila = "negru"; $vaRiabilA = "alb"; $Variabila = 1;
Atribuirea de valori
Se realizeaza la fel ca si declararea prin intermediul instructiunii de atribuire.
# atribuirea unei valori anume $variabila = 2; # copierea valorii de la o alta variabila $text = $variabila; # copierea valorii functioneaza si in cazul vectorilor # in urma copierii cei 2 vectori vor fi identici $vectorS = $vectorS2; # toate componentele lui $vectorS2 sunt copiate in $vectorS # in cazul vectorilor se pot atribui valori separat fiecarei componente $vectorS[ 0 ] = 100; $vectorS[ 3 ] = 10; $vector[ 'luni' ] = 'Lundi'; $vector[ 'joi' ] = 'Jeudi';
Stergerea variabilelor
De obicei nu e nevoie ca variabilele sa fie sterse dupa ce au fost folosite. Totusi, lucrul aceste se poate face in urmatoarele moduri:
unset( $variabila ); $variabila = null;
Afisarea variabilelor
Afisarea se realizeaza utilizand oricare din instructiunile de afisare:
$variabila = "Text"; $randNou = "<br>"; print $variabila; print $randNou; // echivalent cu cele doua instructiuni print echo $variabila, $randNou;
In anumite situatii, in special atunci cand testati sau depanati codul PHP, puteti folosi doua instructiuni de afisare detaliata a continutului variabilelor: instructiunea print_r, utila in cazul vectorilor, pentru ca afiseaza componentele variabilei specificate, si instructiunea var_dump, ce poate fi folosita pentru orice tip de variabila. Aceasta din urma specifica tipul de data continut si lungimea sa.
$var1 = 123; print "\n print_r: "; print_r($var1); // afiseaza 123 print "\n var_dump: "; var_dump($var1); // afiseaza int(123) $var2 = "test"; print "\n print_r: "; print_r($var2); // afiseaza test print "\n var_dump: "; var_dump($var2); // afiseaza string(4) "test" $var3 = array('aaa', 'bbb', 'ccc'); print "\n print_r: "; print_r($var3); // afiseaza Array ( ... ) print "\n var_dump: "; var_dump($var3); // afiseaza array(3) { ... }
Serializarea si deserializarea variabilelor
Serializarea unei variabile presupune transpunerea continutului ei intr-o forma ce poate fi stocata cu usurinta ca text simplu. Deserializarea este operatia inversa, prin care o variabila este recreata pe baza unui text provenit de la o serializare. Astfel, o variabila definita in PHP poate fi serializata si apoi scrisa intr-un fisier text sau salvata intr-o baza de date, avand posibilitatea de a o restaura oricand.
Serializarea se face folosind functia serialize care primeste ca parametru o variabila si returneaza un text. Operatia inversa se realiza cu ajutorul functiei unserialize.
$variabila = array("componenta1", 2, 3); $ser = serialize($variabila); echo $ser, "\n"; // afiseaza a:3:{i:0;s:11:"componenta1";i:1;i:2;i:2;i:3;} $des = unserialize($ser); print_r($des); // afiseaza vectorul initial
Serializarea este utila atunci cand o variabila trebuie sa fie stocata sau transmisa ca text catre un alt proces. Este necesar insa ca deserializarea sa fie facuta tot din PHP pentru a asigura recrearea corecta a continutului initial.
O alternativa la serializare si deserializare o constituie transformarea continutului variabilei intr-un format text standard, cum este JSON. Avantajul este ca reconstituirea continutului poate fi facuta de orice proces, nu doar de un script PHP.
Ponturi de PHP
Diferenta dintre ghilimele simple si duble la declararea variabilelor
Ghilimelele duble permite compilatorului sa "citeasca" variabilele ce apar in interiorul textului.
$today = date( 'd-m-Y' ); $text1 = "Azi e $today"; print $text1; // Azi e 17-07-2008
Astfel, textul cuprins intre ghilimele duble este procesat inainte de afisare: variabilele sunt cautate iar valoarea lor este afisata in locul numelui.
In cazul apostrofului, textul este afisat neschimbat, iar variabilele nu sunt interpretate.
In cazul apostrofului, textul este afisat neschimbat, iar variabilele nu sunt interpretate.
$today = date( 'd-m-Y' ); $text2 = 'Azi e $today'; print $text2; // Azi e $today
Verificarea daca o variabila e definita
Se pot folosi 2 functii: isset si empty .
// definim o variabila, cealalta definire nu se executa $var = 0; // $var2 = 1; var_dump( isset($var) ); // bool(true) var_dump( isset($var2) ); // bool(false) var_dump( empty($var1) ); // bool(true), pentru ca 0 este considerat nul var_dump( empty($var2) ); // bool(true)Atentie, isset verifica daca variabila a fost definita, pe cand empty verifica daca a fost definita si daca are o valoare considerata vida. O variabila este vida daca are urmatoarele valori:
- "" (text de lungime 0)
- 0 (cifra 0)
- "0" (textul "0")
- null
- false
- array() (vector gol)
Operatorul {}
Pot exista situatii cand anumite variabile trebuie procesate mai inainte decat altele, sau mai inainte de procesarea intregii instructiuni. De exemplu:
$salut = array( 'dimineata' => 'Buna dimineata', 'pranz' => 'Buna ziua', 'seara' => 'Noapte buna' ); print "$salut[ 'pranz' ], vizitatorule"; // eroare
Modul in care am scris variabila ($salut[ 'pranz' ]) este corect. Doar ca PHP-ul nu "stie" sa vada variabila noastra ca pe un element din vector, sa-i ia valoarea si apoi sa afiseze tot textul. Pentru a rezolva aceasta problema folosim acoladele:
print "{$salut[ 'pranz' ]}, vizitatorule"; // "Buna ziua, vizitatorule"
In acest caz spunem compilatorului sa interpreteze mai intai ce este intre acolade (elementul $salut[ 'pranz' ] din vector) si apoi sa afiseze tot textul.
Ori de cate ori e nevoie ca o variabila sa fie interpretata cu prioritate, ea trebuie pusa intre acolade.
Ori de cate ori e nevoie ca o variabila sa fie interpretata cu prioritate, ea trebuie pusa intre acolade.
Dubla indirectare ($$nume)
Limbajul PHP permite referirea la numele unei variabile printr-o alta variabila.
$masina = "Chevrolet"; $avion = "Boeing"; $tren = "TGV"; $obiect = 'masina'; print $$obiect; // Chevrolet $obiect = 'tren'; print $$obiect; // TGVPentru a intelege ce se intampla, trebuie mentionat ca ultima linie poate fi scrisa astfel:
print ${$obiect};In virtutea explicatiei de mai sus a operatorului {}, putem vedea usor ca PHP mai intai extrage valoarea variabilei $obiect ( care este: "masina" ) si apoi afiseaza variabila $masina (care are valoarea "Chevrolet").
Constante
Constantele sunt entitati care nu isi schimba valoarea pe parcursul executiei. Sunt utile pentru a recunoaste usor valorile folosite in cod. De exemplu, e mai usor de inteles urmatorul cod, cand se foloseste o constanta decat daca s-ar folosi cifra 5
define( 'ZILE_LUCRATOARE', 5); $zile = array( 'luni', 'marti', 'miercuri', 'joi', 'vineri', 'sambata', 'duminica' ); print 'Zilele lucratoare sunt: '; for( $i = 0; $i < ZILE_LUCRATOARE; $i++ ) { print $zile[ $i ] . ' '; }
Asadar constantele de definesc folosind define:
define( 'NUME', "Flo" ); define( 'VARSTA', 10 ); define( "ADEVARAT", true );
Este recomandat ca numele constantelor sa fie scris cu majuscule (pentru a fi mai usor identificate) desi nu este obligatoriu. Atunci cand se folosesc, se specifica doar numele, fara ghilimele sau $:
print "Ma numesc " . NUME; print " si am " . VARSTA . " ani";
Pentru a verifica daca o constanta este definita, se foloseste functia defined
if( defined( 'NUME' ) ) { print "Ma numesc " . NUME; } if ( !defined( 'VARSTA2' ) ) { define( 'VARSTA2' , 20 ); } print " Am " . VARSTA . " ani";