PHP 8 újdonságok röviden

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.