Stigao je PHP 8!
U studenom 2020., točnije 26. studenog, u svijet je pušten PHP 8! Kada se prvi broj verzije promijeni u programskom jeziku, to obično znači da su napravljene velike revizije. Osmica predstavlja veliku verziju i time možemo očekivati neke velike promjene zajedno s brojnim novim značajkama i poboljšanim performansama. Neke od značajki koje su novost su JIT compiler, imenovani argumenti, atributi, throw i match izrazi, union tipovi, nullsafe operator, nasljeđivanje privatnih metoda, konstruktor svojstava i brojne druge.
JIT
JIT compiler je definitivno značajka koja uzima najviše pažnje jer izravno utječe na brzinu PHP-a. PHP8 je prva verzija koja ima compiler i to je značajka o kojoj se sada najviše priča. JIT, ili “just in time” compiler obećava poboljšanja u smislu brzine za kompleksne zadatke i algoritme čime se otvaraju mogućnosti PHP jeziku da proširi svoje područje djelovanja.
Kada se izvršava PHP do sada se obično radilo tako da se kompajlirao i izvršavao kroz virtualku. JIT to mijenja tako da kompajlira kod izravno u x86 strojni kod i zatim izvršava taj kod direktno na procesoru. Za sve aplikacije gdje se koriste kompleksni matematički izračuni to će svakako ubrzati stvari, no vjerojatno se neće baš osjetiti na standardnim web stranicama.
Nova funkcija: str_contains
Ako želite istražiti da li neki string sadržava neki drugi string onda bi do sada koristili strpos(). Dakle time bi uzeli cijelu hrpu sijena i iglu koju tražite i vratilo bi vam integer koji indicira prvu poziciju gdje se igla mogla naći. Kako vam vraća poziciju jednog stringa unutar drugog, onda i niste baš sigurni je li ju strpos() stvarno našao. Ako vam recimo vrati 0 (jer su pozicije indeksirane s nulom i prva pozicija je u stvari 0, a ne 1) tada će uvjet tretirati to kao pogrešnu vrijednost i reći da nije našao string.
To vam komplicira stvar i realno to znači da bi uvjet morali pisati npr. ovako strpos($sijeno, $igla) !== false, jer false daje do znanja da nije mogao naći poziciju stringa. Ovo i nije baš lako razumljiv način da tražite jedan običan string.
if (strpos(‘Igla se nalazi u ovoj hrpi sijena, ‘Igla’) !== false) {
// pronađeno
}
Zato sada, da se izbjegnu ovakve nejasne pojave u PHP8 imamo str_contains(). Time dobivate jednu jednostavnu boolean vrijednost koja pokazuje je li ili nije igla u sijenu. To je mnogo jednostavnije za razumijevanje i kodiranje.
if (str_contains(‘Igla se nalazi u ovoj hrpi sijena, ‘Igla’)) {
// pronađeno
}
Union tipovi
Union tipovi pokazuju da je vrijednost jedna od dvije (ili više) zadanih tipova. Do sada, u prethodnim verzijama, ste mogli definirati isključivo jednu vrijednost za svojstva, parametre i povratne vrijednosti. Iznimka je dakako PHP7.1 gdje ste osim jedne vrijednosti mogli dodati i null vrijednost. PHP 8 omogućuje da svojstva, parametri i povratne vrijednosti imaju više od jedne definirane vrijednosti, a njih definirate okomitom linijom u obliku t1|t2|t3|… čime zapravo deklarirate OR uvjet za više tipova i možete ih koristiti na svim pozicijama gdje se mogu koristiti tipovi. Iskusni PHP developeri su to već radili od verzije 7.1, i za situacije gdje je potrebno više od null i iterable su koristili PHPdoc anotacije za razne workarounde.
Sada workaround nije potreban, ali to može postati malo kompliciranije jer s union tipovima kod može postati dosta nerazumljiv ako je unesen velik broj tipova.
class Primjer{
private int|float $igla;
public function squareAndAdd(float|int $sijeno): int|float {
return $sijeno ** 2 + $igla;
}
}
Iako malo kompliciraju, union tipovi ipak donose i neke koristi. Budući da su prisilni, greške se mogu uhvatiti rano i informacije u njima imaju manje šanse da budu zastarjele. Tipovi se provjeravaju kod nasljeđivanja i koristi se Liskov princip zamjene.
Promjene reflektivnog API-a
Iako mala, ipak je prisutna promjena na Reflektivnom API-u. To je posebno bitno ako koristite sustav atributa koje sada pomoću Reflektivnog API-a možete povući na bilo koju reflektivnu klasu. Kako su uvedeni union i mixed tipovi, prije korištene metode metode getClass(), is Array() i isCallable() postaju deprecirani. Sada je mnogo korisnije koristiti metodu getType() koja vam da kompletnu listu tipova koji zadovoljavaju određeni zadani parametar.
Kvalitetniji kod
Velika razlika koju ćete sada primijetiti s PHP 8 je da su mnoga upozorenja i greške, koje je prije bilo teško uhvatiti, sada klasificirana kao izuzetci u kodu ili greške. Zahvaljujući tome sada ih možete uhvatiti i logirati. Ukoliko ste na prijašnjim verzijama imali nekih problema koje nikako niste mogli logirati, sada s updateom bi mogli isplivati u log datotekama.
Nullsafe operator RFC
Neki novi elementi kao nullsafe operator, dosta poboljšavaju čitljivost napisanog koda i snalaženje u istom. Naime, kod sada postaje kraći i ljepši, iako je čudno reći da kod može biti lijep. Nullsafe operator sada pruža funkcionalnost koja bi se mogla usporediti s null koalescencijom, s tim da podržava i pozivanje metoda. Sada umjesto nekoliko ugnježđenih if metoda s korištenjem nullsafe operatora sve se da napisati jednom linijom koda. Odnosno umjesto korištenja klasičnog !== null možete to zamijeniti s “?” operatorom i sve strpati u jednu liniju
U starijim PHP:
$country = null;
if ($session !== null) {
$user = $session->user;
if ($user !== null) {
$address = $user->getAddress();
if ($address !== null) {
$country = $address->country;
}
}
}
Sada u PHP8:
$country = $session?->user?->getAddress()?->country;
Zaključak
Ovdje nisu navedene sve promjene jer njih ionako možete pronaći u PHP dokumentaciji. Osmica je svakako donijela dosta promjena. Neke pojednostavljuju stvari dok druge donose nove komplikacije.