Majoritatea persoanelor care folosesc PHP 5.6 se gandesc daca o migrare către PHP 7 ar fi benefică sau nu pentru aplicațiile lor și ce presupune această migrare.
Înainte de migrarea către PHP 7 se recomanda o analiza a funcțiilor predefinite folosite în cadrul aplicației. Deși în procent de 99% funcțiile predefinite in php 5.6 se vor regăsi și în PHP 7 există unele funcții care în versiunea de PHP 5.6 apar ca fiind învechite iar în versiunea de PHP 7 au fost înlăturate.
De exemplu functia eregi() (odată cu versiunea PHP 5.3 aceasta devine învechită și este înlătura complet în versiunea de PHP 7.0.0 fiind inlocuita cu functia preg_match() ).
Aceasta analiza este foarte importantă pentru a putea înlocui funcțiile care sunt înlăturate in versiunea noua de PHP, o lipsa a acestei analize poate duce la prăbușirea aplicației odată cu migrarea ei către nouă versiune de PHP (riscul de a umple fisierele de log cu mesaje de avertizare/eroare/atentionare, blocarea fluxurilor de execuție din cauza apelării unei funcții inexistente și alte probleme).
Majoritatea utilizatorilor PHP 5.6 au temerea ca migrarea catre PHP 7 va duce la îngreunarea procesului de dezvoltare în primele luni din cauza introducerii unor functionalitati noi (operatori noi/clase anonime etc) care nu sunt cunoscute de către programatori. Acest argument este unul foarte greșit, deoarece programare este într-o continuă schimbare, iar versiunile superioare stabile de limbaje de programare vor aduce mereu un plus aplicațiilor și vor reduce din timpul efectiv de dezvoltare.
Perioada de acomodare a programatorilor obișnuiți cu PHP 5.6 ar trebui sa fie una relativ scurtă în funcție de nivelul lor de pregătire deoarece sintaxa și modul de funcționare a limbajului rămân aceleași.
Migrarea către versiuni stabile superioare trebuie sa fie una din prioritățile aplicațiilor, deoarece trecerea de la 5.6 la PHP 7 se va face mult mai ușor decat o trecerea de la PHP 4.0 la PHP 8 (versiunea care urmează sa fie lansata).
Migrarea dinspre PHP 5.6 înspre PHP 7 și mai apoi spre PHP 8 va fi o tranziție mult mai lină si mai normala pentru o aplicatie indiferent de complexitatea acesteia. Riscul folosirii PHP 5.6 poate plafona echipa de programatori și aduce un minus din punct de vedere al evoluției și performanței aplicației.
În continuare va voi descrie principalele avantaje ale migrarii catre PHP 7:
- apariția operatorilor noi
- posibilitatea de a grupa pachete folosind use
- suport pentru codul extern
- performanță mai ridicată
- folosirea de tipuri exacte
Operatori noi sunt:
- null coalescing (*)
- spaceship operator(<=>)
* Din punct de vedere al folosii în cadrul aplicațiilor web null coalescing este cel mai folosit operator nou și are impactul cel mai mare.
În exemplul următor putem vedea modul în care se accesează un query param in PHP 5.6. exemplu de ruta:
https://www.exemple.com/client?id=2
Cea mai des intalnita metoda de a accesa parametrul id este aceasta:
$id = isset($_GET[‘id]) ? $_GET[‘id] : null;
Deși recomandarea mea ar fi acesta sintaxa:
$id = filter_input(FILTER_GET, ‘id’);
(se poate pune o valoarea default în cazul în care nu exista id-ul!)
În PHP 7 aceasta sintaxa poate fi inlocuita de operatorul null
coalescing:
$id = $_GET[‘id] ?? null;
În acest fel reducem liniile de cod,iar ca și functionalitate acest operator va verifica dacă valoarea este setata si e diferita de null
si o va returna, altfel va trece la următoarea valoare.
În cazul de fata va verifica:
$id = isset($_GET[‘id]) && null !== GET[‘id] ? $_GET[‘id] : null;
* Ca și un plus pentru cei pasionați de lucrurile mai interesante din PHP și de bune practici, compararea folosind ca prim element constanta este un element de buna practica (protejează împotriva greșelilor)
De exemplu în cazul unei greșeli de scriere prin care se înlocuiește în timpul procesului de dezvoltare a codului a ==
sau ===
cu = atunci null = $id
va genera o eroare, dar $id = null
nu-și va duce la propagarea unui flux greșit!).
Din punct de vedere al eficientei pana la versiunea de PHP 7 (inclusiv PHP 7) compararea cu null este mai eficienta decat folosirea is_null
! Operatorul spaceship este folosit pentru a compara doua expresii fiind un mod de a compara expresii într-o sintaxă mult mai simpla si compactă. În cazul egalitatii va returna 0
. În cazul în care primul operator este mai mare ca si al doilea va returna 1
. În cazul în care primul argument este mai mic ca si al doilea va return -1
.
De exemplu poate fi folosit pentru pentru a compara date de tip int, float, string:
10 < = > 10 -> 0
10 < = > 11 -> -1
10 < = > 9 -> 1
Un alt avantaj îl permite gruparea folosind use pentru a reduce liniile de cod si a crea un cod mai compact:
PHP 5.6:
use some\namespace\ClassA;
use some\namespace\ClassB;
use const some\namespace\ConstB;
use const some\namespace\ConstC;
PHP 7:
use some\namespace\{ClassA, ClassB};
use const some\namespace\{ConstB, ConstC};
La partea de suport extern as evidentia faptul ca majoritatea aplicațiilor folosesc cod extern (de ex. folosirea Composer-ului pentru a aduce pachete externe). Codul extern trebuie actualizat, iar odata cu trecerea timpului majoritatea pachetelor fac migrarea către o versiune superioară de PHP și reduc suportul pentru pachetele cu o versiune de PHP mai veche.
Pentru a putea avea suport continuu este necesara migrarea catre o versiune superioara. Datorita folosirii noului motor Zend (migrarea catre PHP next generation sau PHPNG) viteza a fost semnificativ îmbunătățită datorită noul motor foloseste memoriam ult mai bine.
Aceasta imbunatatire duce la servirea unui număr mult mai mare de utilizatori datorită faptului ca firele de execuție își vor încheia durata de viata mai repede și vor putea servi noi utilizatori datorită timpului de execuție mai scăzut.
Folosirea de tipuri exacte pentru parametri de ex:
function test(int $a) {
return $a
}
Ajută la reducerea numărului de erori cauzate de tipuri de date incorecte. Ca și o paralelă aceasta imbunatatire este similară cu învelișul oferit de TypeScript pentru Javascript pentru reducerea numărului de erori din cadrul aplicațiilor prin mutarea acestora în cadrul compilarii.