Cauta rapid aici ↑

Caracteristici noi in PHP 7

Despre PHP 7

PHP 7 reprezinta singura lansare a acestui limbaj din ultimii 11 ani si inainte de a fi lansat a stat o perioada de 2 ani in care a fost dezvoltat. PHP 7 vine cu o noua versiune a motorului ZEND, ceea ce il face sa fie de doua ori mai rapid folosind mai putina memorie. PHP 7 vine cu un suport considerabil pentru platformele ce ruleaza pe 64 de biti.

Daca ai folosit pana acum PHP inseamna ca ai folosit una din versiunile PHP 5, versiune lansata in anul 2004. Probabil te intrebi ce sa intamplat cu versiunea PHP 6. Aceasta versiune si-a inceput calatoria in anul 2005 si avea un scop foarte ambitios iar acesta consta in oferirea de suport si pentru caracterele ce sunt stocate in format multibyte. Aceste caractere sunt cele scrise in afara caracterelor latine si aici sunt incluse cele in format arabic, chinez sau grecesti dar si diferite simboluri. La versiunea PHP 6 s-a lucrat mai bine de 5 ani cu rezultate modeste si dupa tot acest efort s-a renuntat la aceasta versiune in 2010.

Acest efort considerabil nu a ramas fara urmari iar diferite caracteristici se regasesc in versiunile PHP 5.3 si PHP 5.4. Probabil ca iti amintesti ca la acea vreme versiunile PHP 5.3 si PHP 5.4 au venit cu diferite caracteristici foarte impresionante si din acest motiv multi programatori considera ca versiunea PHP 5.4 ar fi trebuit sa devina versiunea PHP 6.0 a limbajului insa nu a fost cazul.

Din cauza ca diferite caracteristici ce trebuiau implementate in versiunea PHP 6 au fost implementate in PHP 5.3 si PHP 5.4 si intreaga documentatie cu tot ce urma sa vina in PHP 6 a fost publica timp de 5 ani atunci s-a luat decizia sa se renunte la versiunea PHP 6 si sa fie omisa pentru a nu exista nici-o confuzie in legatura cu noile caracteristici ale limbajului PHP. PHP 7 a fost lansat in data de 3 Decembrie 2015.

Caracteristici majore ale PHP 7

Cea mai importanta caracteristica a versiunii PHP 7 nu reprezinta o caracteristica in sine si asta pentru ca PHP 7 este de doua ori mai rapid decat orice versiune anterioara. PHP 7 converteste mult mai rapid liniile noastre de cod in format binar si foloseste mult mai putina memorie pentru acest proces. Pentru a intelege mai bine uitati-va la urmatoarele date ce reprezinta cererile pe care PHP 5.6 si PHP 7.0 le poate procesa intr-o secunda pe diferite platforme.

PHP 5.6

PHP 7.0

WordPress 191 cererii/secunda 374 cererii/secunda
Drupal 182 cererii/secunda 316 cererii/secunda
Magento 41 cererii/secunda 69 cererii/secunda
Laravel 256 cererii/secunda 485 cererii/secunda
Zend Framework 250 cererii/secunda 489 cererii/secunda

PHP 7 concureaza cu el insusi si aici ma refer la masina virtuala dezvoltata de catre cei de la Facebook si care executa codul PHP intr-un mod in care il face mult mai rapid. Masina virtuala poarta denumirea de HipHop Virtual Machine sau pe scurt HHVM. Desi sunt pareri precum PHP 7 este mai rapid decat o versiune PHP 5 sau PHP 7 care ruleaza pe HHVM, pe noi nu ne intereseaza acest lucru pentru ca putem avea aproximativ aceeasi viteza de raspuns fara sa folosim HHVM.

Declaratiile de tip scalare

Aceasta expresie nu trebuie sa va faca sa va ganditi la o caracteristica pe care nu o veti intelege. Daca aveti experienta cu limbajul C atunci cu siguranta stiti despre ce este vorba. Pe scurt PHP 7 ne permite sa fim la fel de eficienti ca in limbajul C si aici ma refer la faptul ca ii putem spune interpretorului de PHP ce tip de valoare poate fi acceptat ca parametru intr-o functie. Inainte de a va arata si exemple trebuie sa va spun ca aceste declaratii de tip scalare sunt de trei feluri.

  • none // ce aveam pana in PHP 7 si insemna none type scalar declaration
  • coercive // lb.en. coercive type scalar declaration
  • strict // strict type scalar declaration

Acum sa va explic ce este cu toate acestea. None type scalar declaration reprezinta modul prin care datele acceptate ca si parametru al functiei cand functia este apelata pot fi de orice tip. Coercive type scalar declaration reprezinta modul prin care ii spunem interpretorului de PHP ca valoarea pe care o acceptam ca argument in momentul apelarii functiei trebuie sa fie de un anumit tip. Acest tip de valoare poate fi numeric sub forma de integer sau float dar si string. Pentru fiecare tip de data acceptata va trebui sa adaugam un cuvant cheie inaintea parametrului functiei cand aceasta este declarata. In cele din urma strict type scalar declaration reprezinta declararea unei lini de cod inaintea functiei cu pricina iar aceasta reprezinta apelarea unei functii predefinite ce va avea un parametru mai special.

Sintaxa

    	function nume_functie(int $a, int $b){
        	// bloc de cod
        }
    

Acum este timpul sa vedem si un exemplu.

    	function adunare(int $a, int $b){
        	return $a + $b;
        }
        adunare(1, 2);
        adunare("1", "2");
        adunare(1.2, 2.3);
        // nici-o eroare
    

Acesta este exemplul prin care ii spunem interpretorului de PHP ca tipul valorilor acceptate trebuie sa fie de tip integer si aici pot fi valori cu sau fara virgula ori valori numerice declarate sub forma unui string, pentru ca asta inseamna acest cuvant cheie de dinaintea parametrului functiei. Acesta prezentat mai sus este coercive type scalar declaration in actiune.

    	declare(strict_types=1);
        function adunare(int $a, int $b){
        	return $a + $b;
        }
        adunare("1", "2");
        adunare(1.2, 2.3); // eroare
    

Acesta prezentat mai sus este strict type scalar declaration in actiune si fata de anteriorul reprezinta ca tipul datelor acceptate ca argument in momentul cand functia este apelata trebuie sa fie numeric si in format integer (valori intregi).

Cuvantul cheie prezentat ce reprezinta o valoare integer nu este singurul acceptat iar PHP 7 ne ofera si alte cuvinte cheie cu care putem sa ii spunem interpretorului de PHP ce tip de date sa accepte. Mai jos le aveti pe toate si fiecare dintre ele reprezinta tipul de date de care spuneam si din acest motiv va veti da seama singuri de rolul pe care il are fiecare in parte.

  • int
  • float
  • array
  • bool
  • string

Returnarea unui anumit tip de valoare

Returnarea unui anumit tip de valoare pe care o functie o face poate fi specificata inainte ca functia sa isi execute blocul de cod din interiorul acoladelor. La fel ca si in cazul anterior vom avea aceleasi trei tipuri si ca sa fiu sigur ca stiti la care ma refer, vi le reamintesc.

  • none // ce aveam pana in PHP 7 si insemna none type scalar declaration
  • coercive (lb.en) // coercive type scalar declaration
  • strict // strict type scalar declaration

Pentru a realiza acest lucru va trebui sa va familiarizati cu noua sintaxa a functiei. Practic aceasta va fi extinta prin adaugarea intre parantezele rotunde si acolada de deschidere a caracterului doua puncte, apoi un spatiu si ulterior tipul de valoare pe care o va returna functia iar aceasta va fi reprezentata de un cuvant cheie (pe care le-ati vazut anterior) ce pot fi int, float, array, bool sau string.

Sintaxa

    	function nume_functie(int $a, int $b): int{
        	// bloc de cod
        }
    

Acum este timpul sa vedem si un exemplu ce reprezinta coercive type scalar declaration.

    	function adunare(int $a, int $b): int{
        	return $a + $b;
        }
        adunare(1, 2);
        adunare("1", "2");
        adunare(1.2, 2.3);
        // nici-o eroare
    

Acum este timpul sa vedem si un exemplu ce reprezinta strict type scalar declaration.

    	declare(strict_types=1);
        function adunare(int $a, int $b): int{
        	// return $a + $b;
        }
        adunare("1.2", "2.3"); // eroare
        adunare(1.2, 2.3);
    

Acum ca ati facut cunostinta cu aceste caracteristici noi ale functiilor va invit sa le folositi in programele voastre cat mai rapid pentru a va familiariza cat mai curand cu ele si sa nu vi se para un alt tip de limbaj cand veti vedea aceste caracteristici in alte programe scrise de alti programatori.

Operatorul de comparare combinat

Operatorul de comparare combinat reprezinta o noua caracteristica in PHP 7. Acest operator este foarte asemanator cu cele pe care le cunoasteti deja iar diferenta este ca va fi alcatuit din trei caractere speciale. Printre programatori i se mai spune si operatorul nava spatiala si asta din cauza felului cum arata cu aceste trei caractere speciale. Acest operator arata in acest fel → <=> ← si va returna urmatoarele valori.

  • $a <=> $b
  • returneaza -1 daca $a este mai mic decat $b
  • returneaza 0 daca $a si $b sunt egale
  • returneaza 1 daca $a este mai mare decat $b

Operatorul de comparare combinat nu face nimic in plus fata de ceea ce puteai face in mod obijnuit cu ceilanti operatori dar scurteaza pasii facuti pana acum intr-unul singur si din acest motiv devine foarte util in eficientizarea codului prin scrierea a cat mai putin cod dar cu acelasi rezultat.

Operatorul contopirii null

Un alt operator ce reprezinta o alta caracteristica in PHP 7 este operatorul contopirii null sau echivalentul in limba engleza null coalescing operator. Acest operator este reprezentat prin scrierea de doua ori a semnului intrebarii. Si acest operator nu va face nimic in plus fata de ceea ce nu puteam face pana in prezent iar diferenta consta tot in scrierea a mai putin cod si mult mai usor de inteles si depanat. Acest operator va returna prima valoare care exista si nu este null.

$value = $user_value ?? $default_value;

Aceasta linie de cod putea fi scrisa inainte printr-o structura if... else dupa cum se poate vedea imediat.

    	if(isset($user_value)){
        	$value = $user_value;
        } else {
        	$value = $default_value;
        }
    

Un alt exemplu in care acest operator este foarte util este in cazul in care am fi avut o structura switch cu multe valori de testat si in loc sa scriem zeci de linii de cod vom scrie doar una. Ca si mod bun de a programa este foarte bine cand folosim acest operator sa adaugam la sfarsit o valoare de baza pentru cazul in care toate valorile de pana atuncti sunt nule, in acest fel ne asiguram ca indiferent de valorile celorlante nu vom avea la sfarsit o valoare nula.

$value = $a ?? $b ?? $c ?? $d ?? $default;

Clase anonime

In PHP 7 avem posibilitatea sa declaram o clasa ce nu are nici-un nume. Sintaxa pentru a declara o clasa anonima este aproape identica cu modul traditional in care declarai o clasa iar diferenta este ca in momentul declararii clasei fara nume, aceasta va fi instantiata imediat.

$obj = new class{...}

Daca vrem sa ii atribuim o valoare pe care clasa sa o aiba si pe care sa o retinem cu ajutorul functiei __constructor atunci vom adauga intre numele class si acolada de deschidere valoarea pe care o vrem si intre parantezele rotunde, exact ca si in cazul declararii acesteia in modul traditional.

$obj = new class(10){ function __constructor($a){ echo $a; } }

O clasa anonima poate extinde o alta clasa si va face asta la fel ca si pana acum, nimic nu se schimba insa regula obligatorie este ca in momentul declararii clasei anonime, aceasta sa fie imediat instantiata.

Imbunatatiri in PHP 7

Array-uri ca si constante

Cu siguranta stiti cum se poate declara o constanta in PHP. Pana la versiunea PHP 5.3 acest lucru se putea face doar cu ajutorul apelarii functiei define. Incepand cu versiunea PHP 5.3 o constanta se poate declara si cu ajutorul cuvantului cheie const urmat de un spatiu, apoi numele constantei cu litere mari si ulterior semnul de atribuire plus valoarea atribuita constantei.

Odata cu versiunea PHP 5.6 avem posibilitatea sa declaram un array ca valoare pentru o constanta declarata cu ajutorul cuvantului cheie const iar din PHP 7 avem posibilitatea sa declaram si cu ajutorul functiei define.

  • define('APP_V', '3.0'); // in mod traditional
  • const APP_V = '3.0'; // PHP 5.3
  • const APP_V = array('1.0', '2.0', '3.0'); // PHP 5.6
  • define('APP_V', array('1.0', '2.0', '3.0')); // PHP 7

Functii noi

In versiunea PHP 7 avem functii si clase noi dar si functii care sunt imbunatatite si cu care ne putem imbunatati programele noastre. Va recomand sa cititi documentatia oficiala pentru fiecare dintre ele pentru a afla mai multe.

  • random_bytes(); // returneaza biti securizati criptografic
  • random_int(); // numere securizate criptografic
  • class IntlChar{} // ofera functii (metode) de lucru cu caracterele Unicode
  • session_start(); // accepta un array cu optiunii prin care putem suprascrie optiunile de baza din fisierul php.ini
  • Closure::call // (lb.en. → for binding and calling a closure)
  • assert(); // (lb.en. → can throw custom exceptions, can configure to be ignored in production)
  • preg_replace_callback_array();
  • Generator::getReturn(); // iti permite sa returnezi o valoare finala
  • class ReflectionGenerator
  • class ReflectionTypes
  • metode noi pentru clasele ReflectionParameter si ReflectionFunctionAbstract