Limbajul PHP - Expresii, Operatori, operatii cu siruri de caractere
Expresii in PHP
Expresiile sunt constructii ale limbajului PHP care au o valoare. O expresie poate fi un sir de caractere, un numar, o variabila sau chiar o constructie mai complexa (cum ar fi un apel de functie). Ideea de baza este ca orice poate fi evaluat la o valoare este considerat a fi expresie.
Limbajul PHP este construit in jurul expresiilor, iar acest concept, desi ignorat de multi programatori, este foarte important in intelegerea corecta a modului in care interpretorul PHP evalueaza si executa secventele de cod.
Cele mai simple expresii in PHP sunt, asa cum am amintit, numerele (denumite si number literals) sau sirurile de caractere (string literals). Acestea au o valoare ce poate fi determinata in orice moment, iar aceasta valoare poate fi folosita in operatii (cel mai adesea, la atribuiri). In urma unei atribuiri, o variabila va prelua valoarea expresiei atribuite, devenind ea insasi o expresie. Asadar, avand o instructiune de atribuire de forma
$a = 1;1 este o expresie (number literal) si $a este la randul ei o expresie (variabila).
Mai mult decat atat, in PHP instructiunea de atribuire este in sine o expresie, in sensul ca returneaza o valoare; astfel $a = 1 va returna valoarea expresiei atribuite (1, in acest exemplu). In acest context, putem scrie
// atribuie lui $a valoarea 1, apoi printeaza rezultatul expresiei $a = 1, adica 1 print ($a = 1);
Sau chiar
// atribuie lui $a valoarea 1, apoi atribuie lui $b rezultatul expresiei, adica 1 $b = ($a = 1);
De mentionat este ca expresiile sunt evaluate de la dreapta la stanga. In exemplul de mai sus, mai intai se executa si evalueaza expresia $a = 1 iar apoi se executa atribuirea $b = ... in care operandul din dreapta este inlocuit cu valoarea efectiva obtinuta.
Nu doar atribuirile sunt expresii. Apelurile de functii (predefinite sau definite de programator) sunt considerate expresii si ele, intrucat returneaza o valoare. De asemenea, asocierea mai multor expresii, folosind operatori, genereaza o noua expresie.
Un alt lucru important referitor la expresii este ca valoarea lor se poate modifica in functie de context. Mai exact, se modifica tipul de date de care apartine expresia (din string in numeric, din numeric in logic, etc). Astfel, daca intr-o operatie este necesar un anumit tip de date, iar expresia folosita are alt tip, atunci valoarea este convertita in mod automat. Asta poate fi un lucru bun, sau poate introduce erori in cod; de aceea este important sa se acorde o atentie sporita valorilor expresiilor, in special atunci cand se combina tipuri de date diferite.
Expresiile sunt fundamentul limbajului PHP si aproape orice este o expresie. Ele apar peste tot in codul sursa si pot fi folosite in atribuiri, ca parametrii ai functiilor sau pentru specificarea conditiilor din structurile de control. In cele ce urmeaza vor fi prezentati operatorii limbajului PHP care pot fi aplicati unor expresii si care genereaza (prin compunere) noi expresii.
Operatori in PHP
Operatorii sunt elemente de limbaj ce se aplica expresiilor si dau nastere unor noi expresii. Exista mai multe tipuri de operatori, cu sintaxa si roluri diferite. De retinut este ca toti operatorii vor determina conversia expresiilor componente atunci cand acestea au tipuri diferite de date. Regula de conversie difera de la un tip de date la altul si de la un operator la altul.
Mai jos sunt detaliati operatorii disponibili in PHP.
Operatori de comparare
Operatorii de comparare sunt folositi de cele mai multe ori in cadrul instructiunii if pentru a exprima conditia ce trebuie verificata.
$a == $b // egal $a === $b // identic (aceeasi valoare si acelasi tip) $a != $b // diferit $a <> $b // diferit $a !== $b // ne-identic $a < $b // strict mai mic $a <= $b // mai mic sau egal $a > $b // strict mai mare $a >= $b // mai mare sau egalExemple:
<?php #initializari $a = 4; # initializam $a cu numarul 4 $b = "4"; # initializam $b cu string-ul "4" # operatorul de egalitate if( $a == 4 ) print "\$a este 4"; # va afisa "$a este 4" else print "\$a nu este 4"; # operatorul de egalitate if( $a == $b ) print "Sunt egale"; # va afisa "Sunt egale" else print "Nu sunt egale"; # operatorul de echivalenta if( $a === $b ) print "Sunt identice"; # va afisa "Nu sunt identice" else print "Nu sunt identice"; # Nota: deoarece $a este numar iar $b string, ele nu sunt identice # operatorul de comparare if( $a > 4 ) print "\$a este mai mare decat 4"; ?>Atentie! Daca se compara un string (text) cu un numar, stringul este convertit la un numar. Exemplu:
"text" == 0 // echivalent 0 == 0, evalueaza la true
Daca se compara 2 stringuri ce contin numere, acestea sunt mai intai convertite la numerele pe care le reprezinta si apoi are loc comparatia. Astfel, 2 texte care sunt diferite ar putea fi considerate egale. Exemplu:
"1" == "01" // echivalent 1 == 1, evalueaza la true "1" == "1e0" // echivalent 1 == 1, evalueaza la trueNota: "01" si "1e0" sunt notatii matematice diferite pentru numarul 1.
Diferenta intre operatorii == si =
Operatorul == este diferit de operatorul de atribuire = si nu trebuie confundati. Dublu-egal (==) este folosit pentru comparare iar egal simplu (=) - pentru atribuirea de valori unei variabile.
Operatorul == este diferit de operatorul de atribuire = si nu trebuie confundati. Dublu-egal (==) este folosit pentru comparare iar egal simplu (=) - pentru atribuirea de valori unei variabile.
# $a = 5 este o atribuire. var_dump( $a = 5 ); // 5 # instructiunea print afiseaza rezultatul atribuirii (rezultatul unei atribuiri este # intotdeauna egal cu valoarea atribuita) # $a == 1 este o verificare. Instructiunea afiseaza rezultatul verificarii. var_dump( $a == 1 ); // false
In timp ce atribuirile se pot folosi atat de sine statator ($a = 1;), cat si ca expresii in cadrul instructiunilor (print $a = 1; return $a = 1;) operatorii == sau === sunt folositi doar in cadrul instructiunilor.
# corect $a = 10; # atribuire de sine statatoare var_dump( $a = 10 ); # atribuire + afisarea rezultatului atribuirii # incorect - nu genereaza erori dar aceasta constructie este inutila. $a == 1; # nu se face nimic cu rezultatul comparatiei # corect var_dump( $a == 1 ); # se afiseaza rezultatul comparatiei var_dump( $a === '1' ); # se afiseaza rezultatul comparatiei exacte if( $a == 1 ) echo 'egal'; # se face o verificare
Operatorul ternar
PHP ofera un operator care are 3 termeni si a carui evaluare returneaza o valoare. Sintaxa lui este urmatoarea:
(conditie ? adevarat : fals )
De remarcat ca adevarat, fals si conditie nu sunt instructiuni ci expresii (variabile, constante, stringuri, etc) iar operatorul returneaza o valoare si nu o variabila.
print ( 1 == 2 ? 'egal' : 'ne-egal' ); // afiseaza ne-egal $a = ( 1 == 2 ? 'egal' : 'ne-egal' ); // $a va avea valoarea ne-egal
Operatori de incrementare/decrementare
Incrementare inseamna cresterea valorii, de obicei cu o unitate, iar decrementarea este operatia inversa. PHP ofera (ca si C/C++) posibilitatea ca incrementarea/decrementarea sa se faca printr-un operator, fara sa fie nevoie de o instructiune separata. Spre exemplu:
$a = 1; // initializare // pentru a-l creste pe $a cu o unitate, normal am scrie: $a = $a + 1; // folosind operatorul de incrementare scriem: $a++; // sau ++$a; // pentru a afisa noua valoare, putem aplica operatorul direct din instructiunea print: print ++$a;
Dupa cum se poate observa, putem scrie $a++ si ++$a. Diferenta este ca atunci cand ++ apare inainte de variabila, PHP face mai intai incrementarea si apoi returneaza noua valoare. Cand ++ apare dupa, se returneaza valoarea actuala (ne-incrementata) si apoi se creste cu o unitate. Exemplu:
$a = 1; print $a++; // afiseaza 1 - mai intai se afiseaza valoarea curenta, dupa care $a devine 2; print $a; // afiseaza 2 - $a are valoarea 2 dupa incrementare; $a = 1 print ++$a; // afiseaza 2 - mai intai $a creste cu o unitate, apoi este afisata noua valoare print $a; // afiseaza 2 - $a are valoarea 2;
Nota: aceleasi observatii (legate de pozitie) se aplica si pentru operatorul de decrementare.
$a = 2; print $a--; // afiseaza 2 - mai intai se afiseaza valoarea curenta, dupa care $a devine 1; print $a; // afiseaza 1 - $a are valoarea 1 dupa decrementare; $a = 2 print --$a; // afiseaza 1 - mai intai $a scade cu o unitate, apoi este afisata noua valoare print $a; // afiseaza 1 - $a are valoarea 1;
Operatori de atribuire
$a = 1; // atribuire simpla $a += 4; // echivalent cu $a = $a + 4; $a are valoarea 5 acum $a -= 1; // echivalent cu $a = $a - 1; $a *= 2; // echivalent cu $a = $a * 2; $a /= 3; // echivalent cu $a = $a / 3; $a %= 2; // echivalent cu $a = $a % 2; restul impartirii lui $a la 2 $a = &$b; /* $a este o referinta la $b, adica ambele variabile fac referire la aceeasi entitate; daca $a se schimba, se va schimba si $b. Altfel spus, $a este un alias pentru $b */ $s = "Salut"; // atribuire simpla $s .= " straine!"; // echivalent $s = $s . " straine!";
Operatori pentru siruri de caractere
In aceasta categorie sunt inclusi 2 operatori ".=" (operator de atribuire prin concatenare - vezi mai sus) si "."
Punctul (.) este operatorul de concatenare (legare) stringuri.
Punctul (.) este operatorul de concatenare (legare) stringuri.
print "Text1" . " legat de " . "Text2"; // afiseaza Text1 legat de Text2 $a = "Eu am"; print $a . " mere"; // afiseaza Eu am mere;
Operatori de control al erorilor @
Operatorul @ este folosit pentru a suprima erorile sau avertismentele produse de PHP.
// $nedefinit = 1; - nu se executa, variabila nu e definita print $nedefinit; // Notice: Undefined variable: nedefinit in file.php on line 120 @print $nedefinit; // nu va genera nici un avertisment / notificare include( "inexistent.php" ); // Warning: include(nedefinit) failed to open... @include( "inexistent.php" ); // nu afiseaza nici un avertisment
Operatorul de executie ` `
Operatorul de executie permite rularea unor aplicatii sau comenzi ale sistemului de operare direct din PHP. Rezultatul executiei este capturat de script si poate fi prelucrat sau afisat. Operatorul ` ` este echivalent cu functia shell_exec.
# in ambele situatii de mai jos este afisat continutul directrului curent $output = `ls -al`; echo "<pre>$output</pre>"; $output = shell_exec('ls -al'); echo "<pre>$output</pre>";
Alti operatori
PHP mai dispune de urmatoarele tipuri de operatori:
- Operatori aritmetici: +, -, *, etc
- Operatori pe biti: &, |, ^, ~, <<, >>
- Operatori logici: and, or, xor, &&, ||
- Operatori de tip: instanceof
- Operatori pentru vectori: asemanatori celor de comparare, doar ca se aplica vectorilor, operatorul de uniune (+) leaga doi sau mai multi vectori
Siruri de caractere 2
Sirurile de caractere sunt bucati de text, bine delimitate, folosite in codul-sursa pentru diferite scopuri. PHP prezinta particularitati in modul in care sunt folosite string-urile, dupa cum se poate vedea in exemplele de mai jos.
Important! Sirurile de caractere sunt expresii (entitati ce au si returneaza o valoare). Asadar, un string poate fi folosit, pe langa, afisare, in atribuiri, la verificari, etc. In exemplele ce urmeaza s-a optat pentru afisarea sirurilor.
Siruri de caractere delimitate de ghilimele duble
Sirurile delimitate prin ghilimele duble au particularitatea ca pot interpreta variabilele si caracterele speciale din interiorul lor. Astfel, la evaluarea textului, variabilele existente in interiorul lui sunt inlocuite cu valoarea lor iar rezultatul final este returnat.
<?php $a = "valoarea variabilei"; // definesc o variabila print "Textul definit cu ghilimele contine $a"; // va afisa // Textul definit cu ghilimele contine valoarea variabilei ?>
O alta particularitate a acestor siruri o reprezinta folosirea backslash-ului (caracterul \). Acesta are o functie speciala de marcare a anumitor caractere care nu pot fi incluse in mod normal intr-un text (din cauza ca sunt ele insele caractere speciale). Din acest motiv backslash-ul poarta numele de escape character.
<?php print "Ma numesc \"Alex\"!"; // sir ce contine ghilimele, se foloseste \" pentru a afisa ghilimele print "Text afisat pe 3 linii: \n linia 2 si \n linia3"; // atentie, textul e afisat pe 2 linii in sursa HTML cu ajutorul caracterului \n (new-line) // pentru verificare vizualizati sursa paginii (alegeti "View Source" din browser) print "Am castigat \$30 :D"; // caracterul dolar are un statut aparte (marcheaza variabilele) // pentru a afisa semnul $ asa cum este se foloseste \$ print "Text cu \\backslash\\."; // intrucat backslash \ este un caracter special el // poate fi afisat ca atare intr-un text doar daca este dublat // daca e folosit doar un singur \ PHP ar trata textul diferit: print "Text fara \backslash\- \nu se afiseaza corec\t."; ?>
Siruri de caractere delimitate de ghilimele simple
Sirurile delimitate prin ghilimele simple nu permit interpretarea variabilelor continute si nici a caracterelor speciale cu exceptia \' si \\
<?php $a = 'valoarea variabilei'; // definesc o variabila print 'Textul definit cu ghilimele contine $a'; // Textul definit cu ghilimele contine $a print 'Porecla ta e Kelu\' ?'; // sir delimitat de ghilimele simple ce contine un apostrof print 'Text cu backslash \\'; // sir delimitat de ghilimele simple ce contine un backslash print 'Alte escape chars nu sunt interpretate \n \t \b'; // textul este afisat ca atare ?>
Siruri de caractere delimitate cu notatia speciala <<<
Aceste siruri de caractere au avantajul ca nu necesita marcarea (escaparea) delimitatorilor prin \' sau \". In rest, aceste stringuri sunt tratate in acelasi mod ca cele delimitate de ghilimele duble, in sensul ca permit interpretarea variabilelor si a altor caractere speciale.
<?php $a = 'valorii lor'; // definesc o variabila print <<<TXT Text pe mai multe linii. <br /> Delimitatorii pot avea orice nume: TXT, START, etc, cu urmatoarele conditii: <br /> - ambii delimitatori (de inceput si sfarsit) trebuie sa aiba acelasi nume - inainte de primul delimitator se foloseste <<< - delimitatorul de inceput nu trebuie sa fie urmat de spatiu sau alt caracter (important!) - delimitatorul de final sa fie la inceputul liniei (fara spatii inainte) - dupa delimitatorul final se pune punct si virgula ; - pot contine ghilimele " sau apostrof ' fara nevoia de a le escapa - permit interpretarea variabilelor si afisarea $a TXT; ?>
In versiunile mai noi de PHP (de la 5.3.0) a fost introdusa posibilitatea de a defini siruri prin notatia speciala <<< fara a interpreta variabilele continute. Exemplul de mai jos foloseste un sir astfel definit (vezi diferenta la delimitatorul de inceput).
<?php $a = 'valoarea'; // definesc o variabila print <<<'TXT' Incepand cu versiunea 5.3.0 exista un alt mod de delimitare a sirurilor in care variabilele si caracterele speciale nu sunt interpretate. <br /> Asadar $a si \n raman asa cum sunt. TXT; ?>
Operatii cu siruri de caractere
Mai jos sunt prezentate operatiile uzuale cu siruri de caractere si functiile oferite de limbajul PHP pentru realizarea lor.
Lungimea sirului
$s = "acesta este un text"; $sir = "stiu PHP stiu HTML stiu CSS"; # ce lungime are sirul? (numarul de caractere) print strlen( $s ); // 19
Cautarea unei secvente
# verific daca un cuvant sau text (in cazul de fata cuvantul 'PHP') apare in # sirul exprimat prin variabila $sir if( strstr( $sir, 'PHP' ) !== false ) print 'gasit'; else print "nu am gasit"; # pentru a nu tine cont de litere mari/mici se foloseste stristr if( stristr( $sir, 'phP' ) !== false ) print 'gasit';
Afisarea unui subsir
# afisez o sectiune din sir print substr( $sir, 0, 4); // stiu print substr( $sir, 5 ); // PHP stiu HTML stiu CSS print substr( $sir, 5, -3 ); // PHP stiu HTML stiu print substr( $sir, -3 ); // CSS # returnez doar un caracter din string print $sir{5}; // P print $sir{ strlen($sir)-1 }; // S
Transformarea sirului
# inlocuirea unor secvente print str_replace( "stiu", "invat", $sir); // invat PHP invat HTML invat CSS # schimb tipul literelor (mari, mici) print strtoupper( $s ); // ACESTA ESTE UN TEXT print strtolower( $sir ); // stiu php stiu html stiu css print ucfirst( $s ); // Acesta este un text print ucwords( $s ); // Acesta Este Un Text # sterg spatiile de la inceput si sfarsit: trim, ltrim, rtrim print trim(' ok '); // ok # caractere "enter" transformate in <br /> print nl2br( "acesta e afisat pe \n 2 linii" ); // acesta e afisat pe <br /> 2 linii
Impartirea (spargerea) sirului
# impart sirul dupa un caracter, cuvant sau un alt sir $output1 = explode( "stiu ", $sir ); // impart dupa stiu<spatiu> /* Array ( [0] => PHP [1] => HTML [2] => CSS ) */ # impart sirul dupa o expresie regulata (regex) $output2 = preg_split( '/ /', $s ); // impart dupa spatiu /* Array ( [0] => acesta [1] => este [2] => un [3] => text ) */ # operatia inversa impartirii unui sir: $a = implode( 'invat ', $output1 ); // invat PHP invat HTML invat CSS $b = join( '-', $output2 ); // acesta-este-un-textNota: implode si join sunt echivalente (nu exista nici o diferenta intre ele), pe cand explode si preg_splitsunt diferite.
Concatenarea (legarea) sirurilor
print 'Text 1' . " legat de " . 'text 2' . "\n"; // Text 1 legat de text 2 // se pot concatena siruri rezultate din alte functii sau din variabile print ucfirst($sir) . '!!! ' . $s;
Nota: prin concatenarea sirurilor se obtine in final un singur sir, care este tratat ca atare, de sine statator. Altfel spus, prin legarea mai multor siruri se obtine o singura entitate (o singura expresie). Aceasta poate fi transmisa ca parametru unor functii sau instructiuni precum print care accepta un singur argument.
Interpretarea sirului
# parsez un Query String $str = "first=value&arr[]=foo+bar&arr[]=baz"; parse_str($str); print $first; // value print $arr[0]; // foo bar print $arr[1]; // baz parse_str($str, $output); print $output['first']; // value print $output['arr'][0]; // foo bar print $output['arr'][1]; // baz
Masuri de siguranta
In cazul in care textul provine din surse nesigure (cum ar fi un formular de comentarii), atunci este indicat sa fie "sterilizat" (sanitized), prin eliminarea elementelor ce pot fi daunatoare (tag-uri HTML, caractere speciale, etc).
print addslashes( "Baiatu' ia vino-ncoa'!" ); # Baiatu\' ia vino-ncoa\'! # functia inversa este stripslashes(); print htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES); # afiseaza <a href='test'>Test</a> # functia inversa este htmlspecialchars_decode() print strip_tags( "<p>E <b>bold</b></p>" ); // E bold print strip_tags( "<p>E <b>bold</b></p>", '<b>' ); // E <b>bold</b>
Niciun comentariu:
Trimiteți un comentariu