Sunteți pe pagina 1din 9

Capitolul 2 Expresii i operatori

Capitolul 2 Expresii i operatori

Operatorii sunt simboluri folosite pentru a manipula informaii precum cele coninute n variabile, n scopul obinerii a noi variabile. Valorile aupra crora acioneaz un operator se numesc operanzi. O combinaie legitim de operanzi i operatori care produce un rezultat (o valoare) se numete expresie. Pentru c orice expresie produce un rezultat, rezult c orice expresie poate fi atribuit unei variabile. Toi operatorii solicit un anumit tip de operanzi. Dac operanzii pe care i primesc sunt de un alt tip, atunci realizeaz o conversie implicit a acelor operanzi. Exist operatori care modific valoarea sau/i tipul operanzilor asupra crora se aplic, alii nu fac acest lucru. Este limpede c operatorii din prima categorie (cei care modific valoarea operanzilor) nu pot fi aplicai constantelor i nici valorilor, ci numai variabilelor.

Operatorul de atribuire (asignare) (=) a fost prezentat deja. El are forma: $var = expresie; Se evalueaz expresia din dreapta operatorului, att ca tip, ct i ca valoare, iar rezultatul este atribuit variabilei din stnga. Expresia din dreapta trebuie s fie de tip numeric, boolean sau ir de caractere. Modific operandul din stanga (care, prin urmare, nu poate fi altceva dect o variabil), dar nu i pe cel din dreapta (care poate fi, deci: o variabil, o constant, o valoare, sau chiar o alt expresie). Mai mult, dac variabila din stnga nu exist, operatorul de atribuire o creeaz fr a emite niciun avertisment. Returneaz valoarea atribuit variabilei $var, i asociaz de la dreapta la stnga, ceea ce nseamn c putem scrie atribuiri multiple, ca n exemplele de mai jos: Exemple:
$a = 2 + 3; //$a primete valoarea ntreag 5 $b = $a = 7; //$a primete valoarea 7, apoi aceast valoare este atribuit i lui $b $b = 5 + $a = 3; //$a primete valoarea 3, iar $b primete valoarea 8

Reamintim c atribuirea poate fi fcut prin valoare i prin referin. Operatorul (semnul) care indic referina este &. Operatorii aritmetici sunt cei binecunoscui de la coal. Opereaz asupra unor operanzi numerici (ntregi sau/reali). Ei se pot aplica att unor variabile sau constante, ct i direct asupra unor numere, fiindc nu modific valoarea operanzilor. Dac operanzii nu sunt numerici, se realizeaz conversii implicite: Operatorul Denumire + plus, adunare minus, Exemplu Valoare 5 + 19 24 Observaii Dac ambii operanzi sunt ntregi, rezultatul este ntreg, iar dac unul din ei este real, rezultatul este real Dac ambii operanzi sunt ntregi, rezultatul este

4 - 12

-8

Pag. 1

Capitolul 2 Expresii i operatori


scdere / * % mprire, ct nmulire, produs modulo, rest 5/3 5*4 17%5 ntreg, iar dac unul din ei este real, rezultatul este real 1.6666... mprirea la zero produce un avertisment (eroare nefatal). Altfel, rezultatul este un numr real. 20 Dac ambii operanzi sunt ntregi, rezultatul este ntreg, altfel este real 2 n cazul n care unul dintre operatori nu este ntreg, se folosete o conversie implicit. Dac al doilea operand este 0, este emis un avertisment.

Observaie: Operatorul + poate fi aplicat i array-urilor, caz n care returneaz un array reuniune, care conine toate elementele primului array, i toate elementele celui de-al doilea array care au chei diferite de cheile folosite de primul array. Acest operator este, n mod evident, mai util atunci cnd avem de reunit iruri cu chei de tip string. Mai multe detalii vor fi prezentate la capitolul despre array-uri. Operatorii aritmetici de atribuire cu scurtcircuit sunt: +=, -=, /=, *= i %=. n fapt, aceti operatori nu reprezint altceva dect nite convenii de notare prescurtat. Concret, n loc de:
$var = $var op $a;

scriem, pur i simplu:


$var op= $a;

Operatorii de incrementare i decrementare sunt operatori unari care accept operanzi ntregi. Exist un operator de incrementare (++) i unul de decrementare (--) care se pot aplica n faa variabilei (++$var, --$var), caz n care vorbim de preincrementrare, respectiv predecrementare, sau n dreapta variabilei ($var++, $var--), caz n care vorbim de postincrementare, respectiv postdecrementare. Efectele incrementrii i decrementrii sunt reprezentate de mrirea, respectiv micorarea cu o unitate a operandului (dac $var = 5, atunci, ++$var i $var++ vor avea valoare 6, iar --$var i $var--, valoarea 4). Evident, operatorii de incerementare/decrementare modific valoarea operandului, prin urmare nu se pot aplica direct dect unor variabile:
7++; // eroare ($a+$b)++; // eroare

Urmtorul program demonstreaz diferenele dintre pre- i postincrementare, care sunt identice cu cele dintre pre- i postdecrementare: n cazul preincrementrii/decrementrii, operandul este, mai nti incrementat/decrementat, si numai apoi utilizat ntr-o expresie mai mare, n timp ce n cazul postincrementrii/decrementrii lucrurile stau exact pe dos.
<?php $a = 5; if (6 == ++$a){ echo "Preincrementare: Valoarea lui \$a este nti incrementat i apoi utilizat n expresie <br/>"; } else { echo "Ghinion <br/>"; } echo "Valoarea actual a lui \$a este $a <br/>"; if (6 == $a++){ echo "Postincrementare: Valoarea lui \$a este nti utilizat n expresie i apoi incrementat <br/>"; } else { echo "Ghinion <br/>";

Pag. 2

Capitolul 2 Expresii i operatori


} echo "Valoarea actual a lui \$a este $a <br/>"; ?>

Rezultatul execuiei programului este:


Preincrementare: Valoarea lui $a este nti incrementat i apoi utilizat n expresie Valoarea actual a lui $a este 6 Postincrementare: Valoarea lui $a este nti utilizat n expresie i apoi incrementat Valoarea actual a lui $a este 7

Explicaie: Operatorul == este unul de testare a egalitii l vom discuta ulterior. Instruciunea if realizeaz o bifurcare a programului, n funcie de rezultatul evalurii unei expresii logice: dac aceasta este true, se execut ramura direct, dac nu cea cu else. n cazul nostru, se iniializeaz o variabil $a cu valoarea 5, apoi se testeaz dac preincrementnd aceast variabil, obinem c are valoarea 6. Acest lucru este adevrat, deoarece preincrementarea are loc nainte de comparaie, i ca urmare se afieaz mesajul corespunztor ramurii directe. Reinnd aceast valoare actual, se testeaz dac postincrementnd aceast variabil, obinem c are valoarea tot 6. Acest lucru este, de asemenea, adevrat, deoarece nti se efectueaz comparaia, i, prin urmare, rezultatul ei nu este afectat de incrementare. Pentru a verifica, totui, c s-a produs incrementarea, afim valoarea curent a variabilei i aceasta este, aa cum ne-am ateptat, 7. Observaie: ncercarea de a incrementa o constant se va solda cu o eroare. Nu putem scrie, pur i simplu ++5 (sau 5++), ci trebuie s iniializm o variabil cu valoarea respectiv, i pe aceea s o incrementm. De asemenea, nu se poate aplica o dubl incrementare/decrementare (ceva de genul ++$a++ sau ++$--; problema nu este generat de un conflict de preceden i nu se rezolv dac folosim paranteze: (++$a)++ sau ++($a--), pentru c incrementarea/decrementarea nu sunt echivalente cu o atribuire de forma $a +=1; sau $a -=1;). Operatorul de concatenare (.) solicit doi operanzi de tip string. Rezult un alt string, obinut prin adugarea celui de-al doilea string n coada primului. Exemplu: abc.123 rezult abc123 Exist i un operator de concatenare cu scurtcircuit (.=). Operatorii de cast explicii sunt operatori unari. Ei sunt de forma:
(tip_nou)$variabila;

Fiindc nu afecteaz valoarea variabilei $variabila, ei pot fi aplicai i asupra unor numere sau constante. n tabelul urmtor sunt prezentate rezultatele conversiilor uzuale. Tipul operandului $a integer integer sau float integer sau float Integer sau float float Conversia (float)$a; (double)$a; (bool)$a; (boolean)$a; (string)$a; (array)$a; (int)$a; Returneaz Valoarea lui $a, ca numr real (zecimal) true, pentru orice valoare nenul a lui $a, false dac $a e 0. stringul corespunztor un tablou (ir), al crui prim element, de indice 0, are valoarea lui $a; valoarea ntreag rezultat din trunchierea numrului real $a

Pag. 3

Capitolul 2 Expresii i operatori


string string string string array array array (integer)$a (int)$a; (integer)$a; (float)$a; (double)$a; (array)$a; (bool)$a; (boolean)$a; (int)$a; (integer)$a; (float)$a; (double)$a; (bool)$a; (boolean)$a; (sunt neglijate zecimalele) numrul ntreg care se poate forma cu primele caractere ale stringului; 0 dac primul caracter nu e numeric numrul real, inclusiv n notaie stiinific, format cu primele caractere ale stringului; altfel 0 un ir al crui prim element, de indice 0, conine stringul respectiv true pentru orice string nenul, false pentru stringul nul 1 n toate cazurile, cu excepia array-ului vid (fr niciun element), cnd returneaz 0 la fel ca la conversia n int true pentru orice array nevid, false altfel

Altfel de conversii (de exemplu integer n object) sunt posibile, dar e mai bine s fie evitate.

Operatorii de comparaie sunt prezentai n tabelul urmtor. Ei solicit, n general, operanzi numerici, iar n cazul n care nu i primesc, opereaz castingurile adecvate. Sunt i situaii n care aceti operatori pot aciona direct pe operanzi de alt tip dect numeric; aceste situaii vor fi prezentate separat. Nu modific valoarea operanzilor i returneaz valori logice (booleene). Iat cum funcioneaz aceti operatori: Operator == Nume egalitate Returneaz true dac cei doi termeni sunt egali (au aceeai valoare) termenii au aceeai valoare i acelai tip Exemplu ($x = 10) $a == 10 prjini $x === 10 prjini Rezultat true Observaii Pentru c al doilea operand se convertete, prin casting implicit, la 10. Pentru c al doilea operand este de tip string, n timp ce primul este ntreg. Castingul implicit nu se aplic aici, prima condiie e ca amndoi operanzii s aib acelai tip.

===

identitate

false

!==

inegalitate

egalitatea returneaz false identitatea returneaz false primul operand este mai mare (strict) dect al doilea

!===

nonidentitate mai mare ca

>

$a !== 10 prjini $a !=== 10 prjini $a > 10 prjini

false

true

false

Pag. 4

Capitolul 2 Expresii i operatori


>= mai mare sau egal ca primul operand este mai mare sau egal dect al doilea primul operand este mai mic (strict) dect al doilea primul operand este mai mic sau egal dect al doilea alias pentru inegalitate $a >= 10 prjini frue

<

mai mic dect

$a < 10 prjini

false

<=

mai mic sau egal dect

$a >= 10 prjini

true

<>

inegalitate

$a <> 10 prjini

false

Form tolerat, dar nerecomandat. Posibil s nu mai fie recunoscut n urmtoarele versiuni.

Observaii: 1. Operatorii =, == i === sunt complet diferii. Folosirea eronat a unui n locul altuia poate duce la erori subtile i, implicit, la o funcionare defectuoas a programului. De exemplu, operatorul de atribuire returneaz ntotdeauna un rezultat (coninutul variabilei $ovariabila), iar poate fi interpretat n mod eronat ca fiind true sau false. Aceasta nseamn c o instruciune de genul: if ($ovariabila = ceva) { ...} else { ...} se va executa invariabil pe ramura lui if, i nu pe cea a lui else, chiar dac valoarea (iniial) a variabilei $ovariabila a fost diferit de ceva. 2. Operatorii formai din mai multe caractere sunt atomi lexicali (asta nseamn c niciun alt caracter nu se poate interpune ntre ele; nu putem scrie = = = n loc de ===). 3. O parte dintre aceti operatori se aplic i array-urilor. Astfel, operatorul ==, aplicat array-urilor returneaz true atunci cnd amndoi operanzii au seturi identice de chei i valori, iar operatorul === returneaz true atunci cnd amndoi operanzii au, pe lng aceleai seturi de chei i valori, i aceeai coresponden cheie-valoare. Sunt disponibili, de asemenea, i operatorii !==, <> i !===. 4. Orice numr pozitiv este mai mare dect un null, orice numr negativ este mai mic. 5. n cazul comparrii datelor de tip logic cu orice altceva, rezultatul e dat de regula false < true. 6. n general, datele de tip object sunt incomparabile sau au reguli specifice de comparare. 7. Pentru a fi comparate, datele de tip string sau resurs sunt transpuse n date numerice, cu excepia comparrii directe a dou stringuri, cnd criteriul care se aplic este cel lexicografic. 8. Dac dou array-uri au aceleai chei, atunci se compar element cu element, altfel, dac, printre cheile unui array se regsesc toate cheile altui array (i cel puin o cheie n plus), atunci primul array e mai mare, altfel sunt incomparabile. 9. n general, comparate cu date de orice alt tip, array-urile i object-ele sunt mai mari, un array i un object sunt incomparabile. 10. Totdeauna cnd avei ndoieli cu privire la funcionarea unui anumit operator de comparaie, consultai manualul sau verificai. Dar, cel mai bine este s nu utilizai astfel de operatori n cazuri dubioase.

Pag. 5

Capitolul 2 Expresii i operatori


Operatorii logici accept operanzi booleeni, n caz contrar se realizeaz conversiile implicite (orice este true, cu excepia stringurilor nule, a numrului 0, a tablourilor neiniializate i a variabilelor NULL). Cu excepia lui ! (not), care este unar, restul sunt operatori binari (accept doi operanzi). Nu modific operanzii i returneaz valori logice (booleene): Operator Nume true op true true op false false op true false op false II or, sau, disjuncie true true True false or or, sau, disjuncie true true True false xor sau exlusiv, xor false true True false && i, conjuncie true false False false and i, conjuncie true false False False ! not, nu, negaie !true == false; !false == true; Dup cum se vede, operatorii II i or, respectiv && i and au acelai efect i chiar se numesc la fel. n aceste condiii, se pune problema dac sunt sinonimi (=interschimbabili) sau nu. Rspunsul este: n general, nu, deoarece, ntre cele dou tipuri de operatori exist o diferen subtil, i anume precedena lor. Precedena se refer la ordinea n care se execut doi sau mai muli operatori implicai ntr-o expresie. Din coala primar tim, de altfel c rezultatul calculului 5+3*2 este 11, i nu 16, deoarece prima dat se efectueaz nmulirea, i apoi adunarea. Desigur, n cazul existenei unui numr relativ mic de operatori, memorarea i aplicarea precedenei lor sunt lucruri simple, dar, dac numrul operatorilor este mare, lucrurile se complic serios. De aceea, n cele ce urmeaz, nu prezint tabelul de preceden a operatorilor el se poate gsi, de altfel, n orice carte de PHP ci v sftuiesc: cel puin atta timp ct suntei nceptori nu v bazai pe regulile de preceden! Folosii parantezele, pentru c ele sunt btute-n cuie, chiar dac asta nseamn s scriei, uneori, ceva mai mult cod. Cu experii n programare lucrurile pot sta altfel, el i pot permite s fie lenei cteodat. Orice valoare, de orice tip, poate fi convertit la o valoare logic, fie implicit, fie explicit. Regula dup care au loc aceste transformri este urmtoarea: orice valoare se convertete la true, cu excepia: Valorii logice false; Numrului 0 (ntreg sau real); irului de caractere vid (), dar i irului de caractere 0 (nu i irurile de caractere 0 sau ); irurilor (array-urilor) fr elemente; Oricrei variabil care este de tip null (deci, nu este iniializat); Obiectelor de tip SimpleXML, fr niciun tag

Exerciiu: Studiai efectul urmtoarelor programe:


<?php $var = 2; if (true or ($var = 5)) echo $var; ?>

i:
<?php $var = 2; if (false or ($var = 5)) echo $var; ?>

Pag. 6

Capitolul 2 Expresii i operatori


Cel dinti afieaz 2, cellalt afieaz 5. Amndou evalueaz o anumit expresie, folosit apoi de if pentru a afia mesajul respectiv. Ambele expresii sunt evaluate la true, altfel nu s-ar afia nimic. Ambele expresii sunt de forma p or q. Iar dac ne uitm la modul n care este definit operatorul or, observm c expresia p or q este evaluat la true ori de cte ori cel puin unul dintre operanzi este true. Problema este cum este evaluat aceast expresie. Fiindc ea poate fi evaluat n dou moduri, i anume, evalund fiecare operand n parte, i apoi evalund expresia n ansamblul ei (aceasta este evaluarea clasic), respectiv evalund primul operand, i apoi i pe al doilea, dar numai dac este absolut necesar, adic dac expresia nu poate fi evaluat altfel (aceasta este evaluarea lene lazy evaluation). Expresia $var = 5 nu este chiar ceea ce s-ar putea numi o expresie logic, dar ea este automat convertit la o valoare logic de ctre interpretorul PHP (puteam i fora acest lucru, fie printr-un cast, fie prin funcia settype()). Valoarea logic la care este convertit expresia este true, deoarece, dup cum am spus, ea returneaz integerul 5, care este apoi convertit la true. Deci, al doilea operand este ntotdeauna true. Ceea ce afieaz la doilea program este perfect logic i inteligibil. Ceea ce afieaz, in schimb, primul program ridic unele semne de ntrebare. De ce 2, de vreme ce prin atribuirea $var = 5 variabila $var a primit valoarea 5? Rspunsul este: pentru c evaluarea nu a avut, de fapt, loc. i nu a avut loc pentru c nu era, de fapt, necesar. Interpretorul PHP folosete, aadar, evaluarea lene. Operatorul de control al erorilor (@). Se folosete pentru a inhiba afiarea pe ecran a mesajelor de eroare nefatale, care pot fi generate de anumite instruciuni. De exemplu, o instruciune de genul:
$a = 7/0;

va conduce la afiarea unui mesaj de eroare precum:


Warning: Division by zero in ...

n timp ce o instruciune precum:


@$a = 7/0;

nu va mai produce niciun mesaj de eroare (acesta va fi nhibat)

Operatorul de selecie: este singurul operator ternar i nu modific operanzii asupra crora acioneaz. Are forma:
(condiie_logic) ? $var1 : $var2

Primul operand trebuie s fie de tip logic, iar ceilali pot fi de orice tip. Returneaz valoarea coninut n $var1, respectiv pe cea coninut n $var2, dup cum $test este true sau false. Din punct de vedere logic, instruciunea:
$var = (condiie_logic) ? $var1 : $var2;

este echivalent cu instruciunea:


if (condiie_logic) {

Pag. 7

Capitolul 2 Expresii i operatori


$var = $var1; } else { $var = $var2; }

(vom studia instruciunea if ulterior). Operatorul backtick: acesta este un tip mai special de operator, care permite execuia direct a unei comenzi a sistemului de operare, dac aceasta este inclus ntre ghilimelele speciale produse de apsarea primei taste (din stnga) de pe al doilea rnd (de sus) al tastaturii:

De exemplu, secvena:
$output = `dir`; echo<pre>$output</pre><br/>;

realizeaz afiarea ntr-o form preformatat (din cauza tagurilor HTML <pre> i </pre>) a ieirii comenzii de sistem Windows dir, care returneaz structura de fiiere i subdirectoare ale directorului curent. Dac lucrai sub un sistem Unix, vei putea folosi, n acelai scop, secvena:
$output = `ls`; echo<pre>$output</pre><br/>;

Alternativ, se poate folosi funcia shell_exec(), cu efect similar (de execuie a unei comenzi a sistemului de operare). Operatorul instanceof se folosete pentru a determina crei clase aparine un obiect dat. Va fi studiat n cadrul capitolelor cu privire la programarea pe obiecte. Operatorii new i clone determin crearea, respectiv copiere (clonarea) unui obiect. Vor fi studiai, de asemenea, la capitolul respectiv. Operatorii de acces la un membru al unui obiect (->), respectiv de acces la un membru static (Paamayim Nekudotayim sau scope resolution) permit accesul la anumii membri au unui obiect (sau ai unei clase) i vor fi studiai n cadrul capitolelor respective.

Pag. 8

Capitolul 2 Expresii i operatori


Operatorul virgul (,) este folosit n contexte n care este posibil enumerarea mai multor expresii. Va fi studiat n legtur cu acele contexte. O alt categorie de operatori, mai rar folosii, este reprezentat de operatorii logici pe bii. Ei sunt utilizai, de regul, de programatorii mai avansai, deorece permit manipularea fin, la nivel de bii, a unor informaii sensibile, prin urmare nu sunt prea interesani pentru nceptori.

REZUMAT: 1. Operatorii sunt simboluri folosite pentru a obine noi variabile (pe baza celor existente). 2. O expresie este o combinaie legitim de operanzi (valori) i operatori, care poate fi evaluat la o anumit valoare. 3. Operatorul de atribuire(iniializare) permite crearea direct a unei variabile pe baza unei valori sau a evalurii unei expresii. Avem dou tipuri de atribuire: prin valoare i prin referin. Doar variabilele logice, numerice i ir de caractere pot fi iniializate prin intermediul acestui operator. 4. Operatorii aritmetici permit efectuarea a diferite calcule aritmetice. Ei pot fi combinai cu operatorul de atribuire. 5. Operatorii logici permit crearea unor condiii logice complexe. PHP folosete evaluarea lene. 6. Operatorii de comparaie returneaz o valoare logic, pe baza comparaiei a dou valori. Ei trebuie utilizai cu circumspecie n situaii neclare. 7. Operatorii de comparaie pe bii reprezint o facilitate avansat a limbajului. 8. Cu ajutorul opertorului de control al erorilor putem inhiba afiarea notificrilor i mesajelor de eroare ale sistemului, atunci cnd acestea nu sunt necesare. 9. Cu ajutorul operatorului de backtick putem executa o comand a sistemului de operare direct din program. 10. Operatorii de incrementare/decrementare realizeaz creterea/scderea cu o unitate a unor operanzi ntregi. 11. Singura operaiune care poate fi aplicat stringurilor cu ajutorul operatorilor este aceea de concatenare. Exist i posibilitatea combinrii operatorului de concatenare cu cel de atribuire. 12. Cu ajutorul operatorilor de cast putem realiza, n mod explicit, conversii nepermanente ale unor date de diferite tipuri. 13. Ali operatori vor fi studiai la timpul potrivit.

Pag. 9

S-ar putea să vă placă și