Documente Academic
Documente Profesional
Documente Cultură
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
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;
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
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
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
!===
>
false
true
false
Pag. 4
<
$a < 10 prjini
false
<=
$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
i:
<?php $var = 2; if (false or ($var = 5)) echo $var; ?>
Pag. 6
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;
Pag. 7
(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
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