Numere intregi x2r5ru
Numerele intregi se pot specifica in modul urmator (exemplul 2.2.1):
$a = 1234; # Numar intreg in baza 10
$a = -123; # Numar intreg negativ
$a = 0123; # Numar intreg in baza 8, octal (echivalent cu 83 in baza 10)
$a = 0x12; # Numar intreg in baza 16, hexazecimal (echivalent cu 18 in baza
10)
Numere reprezentate in virgula mobila
Numerele reprezentate in virgula mobila (double) pot fi utilizate in
oricare din sintaxele urmatoare (exemplul 2.2.2):
$a = 1.234;
$a = 1.2e3;
Dimensiunea numerelor in virgula mobila este independenta de platforma.
Precizia uzuala este de 14 cifre.
Observatii:
de obicei fractiile zecimale simple, precum 0.1 sau 0.7, sunt convertite intern
cu o mica pierdere de precizie; aceasta poate sa duca la rezultate mai putin
exacte. De exemplu: floor( 0,1 + 0,7*10) intoarce de obicei 7 in
loc de asteptatul 8, rezultatul reprezentarii interne fiind de genul 7,9999999999;
este imposibil sa se exprime cu exactitate fractiile zecimale cu numar infinit
de cifre; de exemplu, 1/3 in forma zecimala devine 0,33333333...; daca aveti nevoie de o precizie mai mare in compararea valorilor in
virgula mobila trebuie sa utilizati functiile matematice de precizie arbitrara.
Siruri de caractere
Sirurile de caractere pot fi delimitate de ghilimele sau apostrofuri, in
ultimul caz inhibandu-se evaluarea variabilelor din interiorul sirului
respectiv (exact ca la bash).
Daca sirul de caractere este delimitat de ghilimele atunci variabilele din
interiorul sirului vor fi evaluate si inlocuite prin valoarea lor. Ca
si in C sau Perl, caracterul backslash (\) este utilizat pentru a proteja
un carcater special.
Secvente escape Valoare
\n Linie noua (linefeed, LF sau 0x0A in ASCII)
\r Intoarcere la linie (carrige return, CR sau OxOD in ASCII)
\t Tab orizontal (HT sau 0x09 in ASCII)
\\ Backslash
\$ Semnul dolarului
\" Ghilimele
\a0-7i A1,3S Ordinea caracterelor corespunzand expresiei normale este
un caracter in baza 8
\xa0-9A-Fa-fi A1,2S Ordinea caracterelor corespunzand expresiei normale
este un caracter in baza 16
Orice caracter se poate transforma, teoretic, in secveta escape, dar
se produce un avertisment la cel mai inalt nivel. A doua metoda incadreaza
sirurile intre apostrofuri; in acest caz singurele secvente escape
intelese sunt '\\' si '\'. Variabilele nu vor fi expandate intr-un
sir incadrat intre apostrofuri. O alta metoda de a delimita sirurile
este folosirea sintaxei doc '<<<'. Dupa acest delimitator trebuie specificat
un identificator, apoi sirul de caractere propriu-zis si, in incheiere,
acelasi identificator care a precedat sirul.
Exemplul 2.2.3:
$str = <<< EOD // Identificatorul de inceput
Exemplu de serie ingloband linii multiple utilizand sintaxa heredoc.
EOD; // Identificatorul de sfarsit
/* Exemplu mai complex cu mai multe variabile */ class joc
A var $joc; var $bar; function joc()
A
$this->joc = 'Joc';
$this->bar = array( 'Bar 1', 'Bar 2', 'Bar 3');
S
S
$joc = new joc();
$name = 'MyName'; echo <<< EOT
My name is "$name". I am printing some $joc->joc.
Now, I am printing some A$joc->bara1iS. This should print a capital 'A':
\x41
EOT;
Sirurile pot fi concatenate utilizand operatorul '.', operatorul '+' fiind
impropriu pentru aceasta operatie.
Exemplul 2.2.4:
/* Asignarea unui sir */
$str = "Aceasta este o serie";
/* Concatenarea sirului cu un text nou */
$str = $str . " Cu mai mult text";
/* Un alt mijloc de adaugare, folosind o secventa escape newline */
$str .= " si o nous linie la sfarsit.\n";
/* Variabilele dintr-un sir inclus intre apostrofuri se pot evalua */
$num = 9;
$str = '<p>Numar: $num</p>';
/* Obtine primul caracter al sirului */
$str = 'Un test.';
$first = $stra0i;
/* Obtine ultimul caracter al sirului */
$str = 'Un alt test.';
$last = $stra strlen( $str) - 1i;
Conversia sirurilor
Cand un sir este evaluat ca valoare numerica, valoarea si tipul rezultat
sunt decise dupa cum urmeaza:
sirul va fi evaluat ca un double daca contine unul din caracterele '.', 'e'
sau 'E'. Altfel va fi evaluat ca un intreg; valoarea este data de inceputul sirului. Daca sirul incepe cu o
data numerica valida, aceasta va fi valoarea utilizata. Altfel valoara va fi
0. O data numerica valida este formata din semn (optional), una sau mai multe
cifre (optional un puct zecimal), incheiate eventual cu un exponent. Acest
exponent ('e' sau 'E') este urmat de una sau mai multe cifre. Cand prima
expresie este un sir tipul varibilei va depinde de a doua expresie.
Exemplul 2.2.5:
$aaa = 1 + "10.5"; // $aaa este double (11.5)
$aaa = 1 + "-1.3e3"; // $aaa este double (-1299)
$aaa = 1 + "bob-1.3e3"; // $aaa este integer (1)
$aaa = 1 + "bob3"; // $aaa este integer (1)
$aaa = 1 + "10 Small Pigs"; // $aaa este integer (11)
$aaa = 1 + "10 Little Piggies"; // $aaa este integer (11)
$aaa = "10.0 pigs" + 1; // $aaa este double (11)
$aaa = "10.0 pigs" + 1.0; // $aaa este double (11)
Tablouri
In PHP tablourile se comporta si ca tablouri asociative (hash tables)
si ca tablouri indexate (vectori).
Tablouri unidimensionale
PHP accepta atat tablouri scalare cat si asociative. De fapt nu
exista nici o diferenta intre cele doua. In PHP tabolurile se pot
crea utilizand functiile list() si array() sau se poate seta explicit
fiecare element din tablou.
Exemplul 2.2.6:
# Exemplul A:
$aa0i = "abc";
$aa1i = "def";
$ba"aaa"i = 13;
Se poate de asemenea crea un tablou adaugandu-i valori. De exemplu, putem
extinde tabloul $a ca in exemplul de mai jos (exemplul 2.2.6):
# Exemplul B:
$aai = "hello";
// $aa2i == "hello"
$aai = "world";
// $aa3i == "world"
Vectorii pot fi sortati utilizand functii specializate: asort(), arsort(),
ksort(), rsort(), sort(), uasort(), usort(), si uksort().
Puteti numara elementele tabloului utilizand functia count().
Puteti parcurge un tablou utilizand functiile next(), prev() si each().
Tablouri multidimensionale
Tablourile multidimensionale sunt in realitate tablouri simple. Pentru
fiecare dimensiune a tabloului trebuie adaugata o alta dimensiune adimi la final.
$aa1i = $f; // Tablou unidimensional
$aa"aaa"i = $f; // Tablou unidimensional
$aa1ia0i = $f; // Tablou bidimensional
$aa"aaa"ia2i = $f; // Indicii asociativi si numerici se pot combina
$3a3ia"bar"i = $f; // Indicii numerici si asociativi se pot combina
$aa"aaa"ia4ia"bar"ia0i = $f; // Tablou cu patru dimensiuni
In PHP nu este posibila referirea tablourilor multidimensionale direct
intr-un sir.
Exemplul urmator nu va furniza rezulatul asteptat:
$aa3ia'bar'i = 'Bob'; echo "Acesta nu merge: $aa3iabari";
Exemplul de mai sus va afisa: Acesta nu merge: arrayabari. Operatorul de concatenare
poate fi utilizat pentru a corecta acest lucru:
$aa3ia'bar'i = 'Bob'; echo "Acesta nu merge: " . $aa3iabari;
In PHP 4.0 problema aceasta poate fi rezolvata incluzand referinta
la tabloul din interiorul sirului intre acolade ca in exemplul de
mai jos:
$aa3ia'bar'i = 'Bob'; echo "Acesta nu merge: A$aa3iabariS";
Puteti completa o matrice in multe moduri, dar important este sa intelegeti
cum puteti sa utilizati functia array() pentru tablouri asociative.
Exemplul 2.2.7:
# Exemplul A:
$aa"culoare"i = "rosu";
$aa"aroma"i = "dulce";
$aa"forma"i = "rotund";
$aa"nume"i = "mar";
$aa3i = 4;
# Exemplul B:
$a = array(
"culoare" => "rosu",
"aroma" => "dulce",
"forma" => "rotund",
"nume" => "mar",
3 => 4
);
Pentru tablouri asociative multidimensionale putem imbrica functia array() ca
in exemplul de mai jos: (exemplul 2.2.8)
$a = array(
"mar" => array(
"culoare" => "rosu",
"aroma" => "dulce",
"forma" => "rotund"
),
"portocala" => array(
"culoare" => "potocaliu",
"aroma" => "acru-amarui",
"forma" => "rotund"
),
"banana" => array(
"culoare" => "galben",
"aroma" => "placuta",
"forma" => "bananoida"
)
); echo $aa"mar"ia"aroma"i; // Va afisa dulce
Obiecte
Pentru a crea o variabila de tipul obiect dorit, si eventual pentru a o initializa,
se foloseste operatorul new:
Exemplul 2.2.9:
class aaa
A function do_aaa()
A echo "Doing aaa.";
S
S
$bar = new aaa;
$bar->do_aaa();
Conversia automata a tipurilor
PHP nu accepta definirea explicita a tipului in definirea variabilelor,
tipul unei variabile fiind determinat de contextul in care acea variabila
este utilizata. Acesta inseamna ca daca atribuiti variabilei var un sir
de caractere, var va deveni sir. Daca ii atribuiti o valoare intrega,
var va deveni un intreg.
Un exemplu de conversie automata a tipului apare la utilizarea operatorului
'+'. Daca vre-un operand este double, atunci toti operanzii sunt evaluati la
double, si rezultatul va fi un double. Altfel, operanzii vor fi interpretati
ca intregi si rezultatul va fi tot un intreg. Retineti ca acest
mod de evaluare nu modifica tipul operanzilor care intervin in expresie,
ci numai modul in care ei sunt evaluati.
Exemplul 2.2.10:
$bbb = "0"; // $bbb este sir de caractere (ASCII 48)
$bbb++; // $bbb este sirul de caractere "1" (ASCII 49)
$bbb += 1; // $bbb este acum de tip intreg (2)
$bbb = $bbb + 1.3; // $bbb este acum de tip double (3.3)
$bbb = 5 + "10 Little Piggies"; // $bbb este de tip intreg (15)
$bbb = 5 + "10 Small Pigs"; // $bbb este de tip intreg (15)
Observatie: conversia automata de la un tip simplu la tipul tablou este uzual
nedefinita.
$a = 1; // $a este un intreg
$aa0i = "f"; // $a devine un vector de forma "f"
Desi aparent variabila $a a fost transformata intr-un tablou cu primul
element f, exemplul urmator nu ofera un rezultat la fel de clar:
$a = "1"; // $a este un sir
$aa0i = "f"; // Ce se intampla cu offset-ul sirului?
Conversia explicita a tipurilor
Conversia explicita a tipurilor (cast) se face in acelasi mod ca in
C: numele tipului dorit este scris in paranteze inaite de numele
variabilei.
$a = 10; // $a este un intreg
$bar = (double) $a; // $bar este un double
Conversiile permise sunt:
(int), (integer) - conversia la intreg
(real), (double), (float) - conversie la double
(string) - conversie la sir
(array) - conversie la tablou
(object) - conversie la obiect
Observati ca eticheta si spatiile sunt permise intre paranteze, deci liniile
urmatoare sunt echivalente:
$a = (int) $bar;
$a = ( int ) $bar;
$a = (int)$bar;
Este posibil ca rezultatul conversiei explicite intre doua tipuri sa nu
fie evident.
De exemplu convertind un scalar sau un sir de caractere la tipul array, respectiva
variabila va deveni primul element al tabloului ca in exemplul de mai
jos:
$var = 'ciao';
$arr = (array) $var; echo $arra0i; // Afiseaza ciao
Cand convertiti un scalar sau o variabila de tip sir de caractere la un
obiect, respectiva variabila va deveni un atribut al obiectului, atribut numit
scalar.
Exemplul 2.2.11:
$var = 'ciao';
$obj = (object) $var; echo $obj->scalar; // Afiseaza ciao