Invata PHP cu punctsivirgula.ro

I. Introducere
II. Notiuni de baza
III. Notiuni avansate
IV. Aplicatii
V. Extra
C O N T I N U T
Variabile. Constante

Variabile in PHP    13 ! 


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.

Gabriel a spus print_r - 07.05.2009

care este diferenta dintre print si print_r ?

Adi a spus Diferenta - 04.02.2010

Diferenta intre print si print_r:
http://codingforums.com/showthread.php?t=174016

bvlucretiu a spus Atribuirea de valori - 22.06.2010

As dori sa stiu daca unei variabile i se poate atribui ca valoare un fisier, de exemplu o poza; daca da, cum?

Alexandru a spus Atribuirea de valori - 05.07.2010

O variabila poate face referire la un fisier.

Afirmatia "a avea ca valoare un fisier" poate avea 2 intelesuri
- variabila poate fi o referinta catre fisier, asa cum am spus mai sus
- variabila poate avea ca valoare continutul fisierului (de exemplu daca este un fisier text), ceea ce este iar posibil.

Cat de curand va fi pusa pe site o lectie despre fisiere, in care vor fi descrise ambele aspecte enumerate.

Dan a spus float - 27.11.2010

Ai uitat virgula mobila (floating point)

marian a spus ce ai facut acolo? - 06.09.2013

cand dau click pe testeaza, la exemplele cu vectorii, NU INTELEG nimic din ce ai facut.....si nici scriptul nu imi iese. imi da niste erori...

Alexandru a spus Pentru Marian - 06.09.2013

Exemplele din aceasta lectie nu fac ceva concret, vizibil imediat - ele doar definesc niste variabile. Din acest motiv pare ca si cum nu s-ar intampla nimic.

In lectiile urmatoare exemplele vor fi din ce in ce mai complete, cu mici procesari propriu-zise si rezultate vizibile.

In mod normal, poti adauga instructiuni echo sau print in codul de pe aceasta pagina ca sa validezi ca variabilele au fost populate cu valorile respective.

irina a spus Stergerea unui element al unui vector - 26.02.2015

Cum se poate realiza stergerea unui element in functie de valoare (nu de cheie) si invers? Zi faina! Mersi!

Alexandru a spus Pentru Irina - 26.02.2015

Ai putea cauta elementul si odata gasit il stergi dupa cheia lui. Asta e o varianta doar. Uita-te pe lista de functii cu array-uri ale PHP-ului si vezi ce poti folosi de acolo:

http://php.net/manual/ro/ref.array.php

Doru a spus de ce? - 03.12.2015

in exemplul tau cu var_dump.
la var_dump($var1); afiseaza int(123) si la var_dump($var2); afiseaza string(4) "test".
De ce ? Am incercat si eu sa fac cateva exempl...si niciodata nu-mi afiseaza int.
am pus chiar la variabila un sir de cifre ( m-am gandit ca int e pentru cifre si string e pentru litere ) dar tot string imi arata.
Si ce inseamna int si string(x). banuiesc ca x e numarul de caractere din variabila nu ?

Razvan a spus Rand nou - 14.05.2016

Am facut exact ca mai sus dar totusi nu mi le pune cum e in exemplu ci intr-un singur rand, cum le despart?

Alex a spus Serializarea - 24.08.2016

Nu inteleg ce a afisat serializarea, imi poate explica cineva ? Adica, de unde au aparut a, i, s..

silvia a spus afisare variabila - 23.04.2018

Cum afisez o variabila ce contine un superscript (TM)? (in loc de TM imi apare ? intr-un rombulet)


Adauga un comentariu la aceasta sectiune.

 


Ponturi de PHP    9 ! 


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").
lup a spus E true - 04.07.2010

Aveti o contradictie in acest text :-?

"Nota: pentru valorile de mai sus, empty returneaza false"

Cred ca valoarea lui "empty" in aceste cazuri e TRUE.

Alexandru a spus Multumesc, Lup - 05.07.2010

Ai perfecta dreptate. Am corectat.

dyana a spus nelamurire - 27.08.2010

Mie asta imi afiseaza dupa ce am dat copy paste. Nu ar trebui sa-mi afiseze data?
$today = date( 'd-m-Y' ); $text1 = "Azi e $today"; print $text1;

Myhai a spus Codul de sus pt.data e bun - 17.02.2011

Nu styu de ce nu iti merge dar mie imi merge bine!

Gabriel MANDU a spus Ghlimelele duble - 28.07.2011

Eroarea apare datorita faptului ca in exemplul dat, corect este "Azi e $today", deci folosirea ghilimelelor duble, si nu a celor simple, pentru ca altfel nu este permisa citirea variabilei $today.

Ionut a spus pt nelamurire - 31.10.2012

Posibil sa afiseze acel lucru pentru ca nu s-a trecut prin interpretorul PHP.

Daniel a spus verificare definire variabile - 12.10.2013

De ce este necesar sa verificam daca o variabila este definita? Daca avem $var=0 exista posibilitatea ca php sa nu execute acest cod?

Alexandru a spus Pentru Daniel - 14.10.2013

PHP va executa intotdeauna $var=0, doar ca in scripturile mai complexe pot exista mai multe modalitati prin care se pot defini variabile. In acest caz poate fi necesar o verificare inainte sa se foloseasca efectiv variabila, pentru a evita erori. Mai mult, functia isset se foloseste in mod uzual si pentru vectori (pentru a verifica daca o cheie exista).

Dana a spus Despre ISSET - 06.04.2015

isset verifica daca variabila a fost definita - nu e tocmai adevarat: variabila poate fi definita si sa nu contina nici o valoare atribuita. De fapt, verifica daca contine o anumita valoare, oricare ar fi ea.


Adauga un comentariu la aceasta sectiune.

 


Constante    19 ! 

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";
Cristi a spus de ce "!defined"? - 18.02.2010

Am observat ca la cel de-al doilea "if" din dexemplu pentru "defined" ai folosit "!" inainte de "defined". Am inteles ca are rol, pentru ca la compilare returneaza un mesaj- "Notice: Constant VARSTA already defined in..."- daca acel semn de exclamare nu mai este, dar care este rolul acestuia?

Cristi a spus Am aflat - 19.02.2010

If(!defined...) inseamna "Daca nu este definita..." Semnul exclamarii este negatia.

Cosmin a spus asa e - 26.03.2010

aveti dreptate :)

zoly a spus De ce este punct-ul? - 21.01.2011

. NUME, . VARSTA . , apare caracterul punct. Pentru ce? Constantele trebuie delimitate?

Myhai a spus Raspuns: - 18.02.2011

Punctul este un operator de concatenare pentru a lega doua stringuri,cum e in cazul de fata.

Alina a spus isset vs defined - 05.05.2011

Care e diferenta intre isset si defined? cand se foloseste fiecare?

Alexandru a spus isset vs defined - 05.05.2011

isset se foloseste cu variabile, pe cand defined este pentru constante.

De exemplu, vei folosi:

if( isset( $variabila ) ) { ... }
if( defined( 'CONSTANTA' ) ) { ... }

Gabriel MANDU a spus Mai multi parametri pentru print ? - 28.07.2011

Ceva mai devreme s-a scris despre faptul ca instructiunea "echo" poate primi MAI MULTI parametri, pe cand instructiunea "print" nu poate primi decat 1 SINGUR parametru. In cazul exemplului dat mai suis de dumneavoastra, cum a fost posibila folosirea mai multor parametri, si anume : " Am " . VARSTA . " ani". Este datorita "." punctului, care asigura o concatenare si atunci este vazut ca 1 singur parametru ... sau ?

Alexandru a spus Mai multi parametri pentru print ? - 28.07.2011

Da, afirmatia este corecta.

In cazul folosirii expresiei " Am " . VARSTA . " ani" la print, datorita punctului (care aici este operator de concatenare) toata constructia este considerata un singur parametru.

Practic, se intampla urmatorul lucru: se concateneaza (leaga) cele 3 elemente rezultand o singura valoare (Am 2 ani) iar aceasta valoare unica este transmisa ca parametru la instructiunea "print"

Daca ar fi fost folosita virgula, care nu este un operator ci doar un caracter de separare, atunci interpretorul ar fi considerat 3 parametrii ("Am ", VARSTA, " ani") si ar fi generat o eroare.

Radulescu Alexandru a spus De ce da eroare - 11.11.2011

<?php
$alex=5
if( isset($buda) ) {print "Alex are 5 ani";}
?>

De ce da aici eroare?Eu vreau sa afisez mesajul Alex are 5 ani doar daca ii definita variabila!

Radulescu Alexandru a spus Am rezolvat problema dar am alta - 11.11.2011

Am rezolvat problema cea de sus. Am uitat sa pun dupa 5 ; . Acuma am alta. Am observat ca imi afiseaza mesajul doar daca pun in fata la isset (!) . De ce?

Alexandru a spus explicatie - 11.11.2011

Semnul exclamarii este folosit pentru a nega conditia.

De exemplu:
if( isset($var) ) - se traduce prin: "daca ESTE definita variabila $var"

Pe cand:
if( !isset($var) ) - se traduce prin: "daca NU ESTE definita variabila $var"

In exemplul tau, ai definit doar variabila $alex. Variabila $buda nu este definita, deci conditia ta - isset($buda) - este falsa si nu va afisa nimic. Daca dupa $alex = 5; pui si $buda = 1; atunci vei defini acea variabila si iti va afisa mesajul.

Andrei a spus intrebare - 14.02.2012

de ce apare i++?

Alexandru a spus intrebare i++ - 14.02.2012

$i++ din cadrul "for" inseamna sa-l creasca pe $i cu o unitate la fiecare pas.

Mai multe detalii despre $i++ gasesti la http://php.punctsivirgula.ro/operatori/
Mai multe detalii despre for gasesti la http://php.punctsivirgula.ro/repetitive/

Florentin a spus Variabile si Define - 20.11.2012

Variabilele si Constantele sunt acelasi lucru , deci se pot folosii cu acelasi scop ... intreb pentru ca am inteles mai mult constantele decat variabilele

Alexandru a spus Variabile si Define - 06.12.2012

Pana la un anumit punct, variabilele si constantele fac acelasi lucru: contin o informatie.

Diferenta vine atunci cand acea informatie se schimba. Variabila va putea fi actualizata (va putea sa faca referire la o noua valoare), pe cand constanta va ramane aceeasi.

De exemplu, presupunem ca avem un script care proceseaza niste fisiere, unul cate unul. Daca vrem sa numaram cate fisiere am procesat la un moment dat, folosim o variabila care va creste cu o unitate la fiecare fisier.

<?php
$procesate = 0;

/* repeta cat timp exista fisiere { */
proceseaza( $fileName )
$procesate = $procesate + 1
/* } sfarsit */

echo "Fisiere procesate: $procesate";
?>


In acest caz n-am fi putut folosi o constanta, intrucat valoarea setata cu 'define' nu va putea fi modificata (este de fapt o eroare de PHP sa incerci sa schimbi o constanta).

In contextul exemplului de mai sus, am putea folosi o constanta pentru a pastra numarul total de fisiere existente (care vor fi procesate), intrucat acest numar ramane constant pe parcursul prelucrarii.

Exemplu:
<?php
define( 'FISIERE_DE_PROCESAT', 100 );
?>

Daniel a spus e grele rau de tot - 30.03.2015

si dupa ce inveti toate smecheriile astea cum le legi pentru a crea un web? din imaginatie sau au o ordine? deci, nu mai stiu de cap, de o saptamana am paralizat langa tutoriale si nu s a prins nimic de mine... help :)

Claudia a spus intrebare - 18.09.2015

Ce este gresit aici?
<?php
define('LOC',"la piata");
define('CE',"pere");
define('CE2',"prune")
print"El este ".LOC." si cumpara ".CE

//print"n"

if(!defined('CE2')){define('CE2',"la prune");
}
print"El este ".LOC."si cumpara ".CE2

print"n"

if(!defined('LOC2')){define('LOC2',"la mercerie");
}
if(!defined('CUMP')){define('CUMP',"ata");
}

print"n"

print"El este ".LOC2."si cumpara ".CUMP

?>

Alexandru a spus Pentru Claudia - 19.09.2015

Nu ai pus punct-si-virgula la finalul instructiunilor de print.


Adauga un comentariu la aceasta sectiune.