joi, 14 ianuarie 2016

15.01.2015 Variabile

Aplicatii server – side limbajul PHP
Variabile


Taguri PHP, instructiuni, punct si virgula    

Codul PHP trebuie inclus in fisiere cu extensia .php ce vor fi deservite utilizatorilor finali si trebuie delimitat de restul continutului prin tagul de inceput <?php si tagul de sfarsit ?>. Practic tot ce se afla in interiorul acestor etichete va fi interpretat ca fiind cod-sursa PHP (cod ce va fi executat de interpretorul PHP). Textul din afara celor 2 taguri este lasat neschimbat, fiind ulterior interpretat de browser. Se pot folosi si alte etichete in functie de configuratia serverului web, dar acestea nu sunt recomandate.
<?php
/* forma recomandata */
?>
 
<script language="php">
/* forma disponibila oricand, putin folosita */
</script>
 
<?
/* taguri scurte, acceptarea lor de catre web-server depinde de configurare */
?>
 
<%
/* taguri in stilul asp, acceptarea lor de catre web-server depinde de configurare */
%>
Codul PHP este format din instructiuni - comenzi date catre interpretor, in urma carora se executa ceva. Asa cum s-a mai spus, PHP este folosit in principal pentru a genera cod HTML, asa ca de cele mai multe ori instructiunile folosite sunt cele de afisare. In aplicatii mai complexe se pot insa folosi si instructiuni de conectare la bazele de date, de citire/scriere/manipulare fisiere, intructiuni de trimitere email-uri si altele. Instructiunile se pot grupa in blocuri delimitate de acolade { }. Aceste blocuri, numite si "instructiuni complexe" se comporta ca si cum ar fi o singura instructiune (vezi mai jos exemple de blocuri).
Toate instructiunile (in afara de blocuri) trebuie sa fie terminate cu punct si virgula ( ; ). Lipsa acestuia genereaza o eroare.

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 printecho 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 simplu
Desi 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 simplu
In 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.
$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)
Nota: pentru valorile de mai sus, empty returneaza true

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.

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; // TGV
Pentru 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";