PHP 8 újdonságok röviden
November 26-án megjelent a PHP 8.0, ami egy új főverzió, és természetesen rengeteg újdonságot hozott magával. A változtatásokról véget nem érő listát lehetne írni, viszont kiválogattuk a legfontosabb újításokat.
Union types
A union típusok lehetővé teszik, hogy egy változónak több különböző típust is megadjunk, mint elfogadható érték.
public function example(int|float $num) {
// Elfogadható értékek: integer, float
}
JIT
A JIT (azaz "just in time") fordító jelentős sebességnövekedést ígér... vagy mégsem?
A Phoronix arról számolt be, hogy PHPBench alatt 92%-os sebességnövekedést mértek PHP 7.4 és 8.0 között. A stitcher.io benchmarkja szerint a repetitív matematikai számításoknál tízszeres volt a sebességnövekedés, viszont "real-life" szituációkban elhanyagolható volt a különbség.
Ebből az szűrhető le, hogy a számításokkal teli kódrészletek hatalmas előnyt élveznek, viszont a hétköznapi kérelmek kiszolgálása nagyjából változatlan marad.
Nullsafe operátor
Az eddig is jól ismert null coalescing operátor (??
) hátránya az, hogy nem használható metódusok meghívására. Itt kap szerepet a nullsafe operátor (?->
).
Ahelyett, hogy manuálisan el kéne végeznünk a vizsgálatokat...
if ($post !== null) {
$user = $post->getAuthor();
if ($user !== null) {
$fullName = $user->getFullName();
}
}
...mostantól 1 sor is elegendő.
$fullName = $post?->getAuthor()?->getFullName();
Illetve egyéb, nagyon gyakori hibák is elkerülhetőek a nullsafe operátor használatával. Tételezzük fel, hogy az alábbi példában a ->getDate()
visszatérési értéke null.
$post->getDate()->format('Y-m-d') ?? null
A null coalescing operátor használatával fatal errort kapunk, mert a ->format()
nem hívható meg null-ra. Viszont nullsafe operátor használatával nem hibát kapunk, hanem null-t.
$post->getDate()?->format('Y-m-d')
Paraméterek megadása név szerint
A PHP eddigi verzióiban számított, hogy a függvények paraméterei milyen sorrendben vannak megadva. Mostantól viszont akár név szerint is megadhatjuk őket, sorrendtől függetlenül.
function example($a, $b, $c, $d) {
//
}
example(d: 'this', b: 'is', a: 'pretty', c: 'neat');
match
A match
tulajdonképpen a switch
-nek az okosabb változata. Képes közvetlen értéket visszaadni, nem igényli a break
-kel való kilépést, illetve több értéket is tud vizsgálni egyszerre.
$isWeekend = match($today) {
'monday', 'tuesday', 'wednesday', 'thursday', 'friday' => false,
'saturday', 'sunday' => true,
};
Leegyszerűsített __construct
Az osztályok példányosításakor történő értékadás eddig valahogy így zajlott.
class Burger
{
public $name;
public $price;
public function __construct($name, $price)
{
$this->name = $name;
$this->price = $price;
}
}
Ez mostantól jelentősen egyszerűbb lesz, a konstruktor mindent megold helyettünk.
class Burger
{
public function __construct(public $name, public $price)
{
// Ilyen egyszerű
}
}
mixed értéktípus
Mostantól megadhatunk mixed
típusú paramétereket, propertyket, illetve visszatérési értékeket. Ez azt jelzi, hogy nem vagyunk biztosak az adott érték típusában, bármilyen típusú lehet (array, bool, object, null stb.).
throw
A throw
mostantól nem "statement", hanem "expression". Ez rugalmasabb működést biztosít. Olyan helyeken is használhatjuk, ahol eddig nem.
$author = $post->getAuthor() ?? throw new AuthorDoesNotExist();
WeakMap
Egy kis kontextus: amikor egy változó (például $age
) megszűnik, a PHP ellenőrzi, hogy vannak-e más változók is, amik erre az $age
változóra mutatnak. Ha nem talál ilyet, akkor úgy veszi, hogy az $age
változó biztonságosan eltávolítható. Ezt nevezik "garbage collection"-nek.
A WeakMap
azt teszi lehetővé, hogy olyan változókat hozzunk létre, amik nem akadályozzák meg a garbage collection folyamatát. Ez jelentősen csökkenti a memory leak esélyét.
::class
Mostantól get_class()
helyett ::class
használatával is megkapható egy adott object osztálya.
$user = new User();
get_class($user); // User
$user::class; // User
Stringable interface
Megjelent a Stringable
interface, ami automatikusan érvényes lesz azokra az osztályokra, amik implementálják a __toString()
metódust.
str_contains()
Igen, ez pontosan az, amire gondolunk. Az eddig megszokott strpos() !== false
helyett mostantól használhatjuk az új str_contains()
függvényt.
strpos('this is pretty neat', 'neat') !== false // Régi módszer
str_contains('this is pretty neat', 'neat') // Új módszer
str_starts_with() és str_ends_with()
Mostantól ilyen egyszerűen vizsgálhatjuk a stringek elejét és végét.
str_starts_with('this is pretty neat', 'this') // true
str_ends_with('this is pretty neat', 'neat') // true
Alapértelmezett error_reporting
Az alapértelmezett error_reporting
mostantól E_ALL
, tehát az E_NOTICE
és az E_DEPRECATED
üzenetek is megjelennek.
Alapértelmezett PDO error mode
A PDO alapértelmezett hibakezelési módja eddig PDO::ERRMODE_SILENT
volt, mostantól viszont PDO::ERRMODE_EXCEPTION
lesz. Ez azt jelenti, hogy PDO hibákba ütközéskor "csendes" debugolás helyett PDOException
-t fogunk kapni.
További részletek
A további újdonságokról a PHP hivatalos bejegyzésében lehet bővebben olvasni.
Természetesen mi is tudunk segíteni a frissítést érintő kérdésekben. Keressetek minket bizalommal a contact@webcapital.hu címen, vagy a Facebookon.