A PHP 8 2020 november végén jelent meg. Ez egy jelentős új verzió, amely további funkciókkal és teljesítménybeli fejlesztésekkel frissíti a nyelvet.
Ebben a cikkben megnézzük a PHP 8 által kínált legnagyobb fejlesztéseket. A kiegészítések és módosítások teljes listája a hivatalos dokumentáció. A dokumentumok tartalmazzák a átfogó migrációs útmutató a projektek PHP 7.4-es frissítéséhez.
1. Attribútumok
Az attribútumok, más neveken más néven kommentárok, mechanizmust biztosítanak a metaadatok hozzáadásához a kódbázisba. Attribútumok osztályokkal, módszerekkel, függvényekkel és tulajdonságokkal használható. Könnyebb velük dolgozni, mint a dokblokk megközelítés számos PHP 7 projekt fogadta el.
Az attribútumokat egyszerű osztályoknak definiálják, amelyek maguk is a PHP beépített bejegyzéseivel vannak ellátva Attribute
tulajdonság:
#[Attribute] class CloudSavvyAttribute { protected string $value; public function __construct(string $value) { $this ->; value = $value; } public function getValue() : string { return $this ->; value; } }
Ezután a kódalapon belüli entitásokhoz csatolhatók:
#[CloudSavvyAttribute("Example")] class CloudSavvyClass { // ... }
Az attribútumok a Reflection API-n keresztül letöltve. Ellenőrizheti és összeállíthatja egy osztályon, módszeren vagy más kódbázis-összetevőkön meghatározott attribútumokat. Az attribútumok valószínűleg a keretekben és a könyvtárakban a leghasznosabbak, ahol segítenek kivonni az alkalmazás-összetevők, például az útvonal-meghatározások és a függőség-befecskendezési vezetékek egyszeri feltérképezését.
2. Megnevezett érvek
Nevezett érvek lehetővé teszi a paraméterek átadását a módszerekhez és függvényekhez egy tömbszerű konstrukció segítségével. Ez egyszerűbbé teszi az opcionális paraméterek kihagyását és a soron kívüli továbbítást.
function foo(?string $a=null, ?string $b=null, ?string $c=null) : void;
A PHP 7-ben a fenti függvény meghívása az érték átadása közben "demo"
nak nek $c
a következő meghívást igényelte:
A PHP 8-ban a következő szintaxis használható helyette:
Ezáltal a sok választható argumentummal ellátott függvényhívások kevésbé ismétlődnek és könnyebben karbantarthatók.
Az osztály tulajdonságainak kezdeti értékekkel való feltöltése a konstruktor egyik leggyakoribb szerepe. Az alábbihoz hasonló kód mindennapos a PHP 7 kódbázisában:
class Example { protected ?string $Property; public function __construct(?string $Property=null) { $this ->; Property = $Property; } }
A PHP 8 támogatja a Kivitelezői ingatlan promóció, rövidített szintaxis, amely lehetővé teszi a tulajdonságmeghatározás, a gépírás és a népesség inline kombinálását a konstruktor aláírásában. A fenti példát a következőképpen lehet átírni:
class Example { public function __construct( protected string $Property=null ) }
Ez a stílus eltávolítja az ismétlést. Használata megkönnyíti a további konstruktor tulajdonságok hozzáadását a jövőben, csökkentve a módosítandó kódrészek számát.
4. Uniótípusok
A PHP típusrendszere tovább fejlődik a PHP 8-mal. Most már lehetőség van a típusokra utalni Kettő vagy több „egyesülése” típusok, ahol a típus értéke az unió bármelyik típusából származhat.
public function foo(string|int $bar) : int|float;
A fenti kitalált példában a foo()
függvény elfogadja a karakterláncokat és az egész számokat is. Vagy egész számot, vagy lebegőt ad vissza.
A gyakorlatban ez a képesség valószínűleg a leghasznosabb, ha a tulajdonságokra és a metódus paramétereire alkalmazzák – jó forma elfogadni a különféle bemeneti típusokat és normalizálni egy jól definiált egyetlen kimeneti típusra.
5. Meccs kifejezés
Az új match
kifejezés egy terser biztonságosabb alternatíva a jól ismert switch
. Nem igényli a case
és break
utasításokat, támogatja a kombinált feltételeket, és egy új kódblokk megadása helyett értéket ad vissza. A típusú kényszer ki van kapcsolva, tehát 1.0
(úszó) nem tekinthető egyenértékűnek a következővel: "1.0"
(karakterlánc), ellentétben a használatával switch
.
Itt van egy tipikus PHP 7 switch
:
switch (1.0) { case 1.0: $result = "Float!"; break; case "foo": case "bar": $result = "foobar!"; break; }
És így nézhet ki ugyanaz a kód a PHP 8-mal:
$result = match (1.0) { 1.0 =>; "Float!", "foo", "bar" =>; "foobar!" }
Ismét az új megközelítés sokkal tömörebb. Az egyik figyelmeztetés, hogy ki kell emelni, hogy a kombinált feltételek szintaxisának értékei nem egy tömbben vannak meghatározva, hanem egyszerű vesszővel elválasztott halmazként, hasonlóan a függvény meghívásához.
6. A „Nullsafe” üzemeltető
Egy másik, más nyelvektől kölcsönzött fogalom, a PHP 8 már támogatja inline null ellenőrzés automatikus rövidzárlattal. Felépíthet egy ellenőrzési láncot, amely megszakad, visszatér null
, amikor bármely elem értékelése sikertelen.
A PHP 7-ben:
$photo = null; if ($user !== null) { if ($user ->; profile !== null) { if ($user ->; profile ->; getPhoto() !== null) { $photo = $user ->; profile ->; getPhoto() ->; getPath(); } } }
És a PHP 8-ban:
$photo = $user? ->; profile? ->; getPhoto()? ->; getPath();
A PHP 8 ismét egyszerűbb megoldást kínál, amely kiküszöböli a fészkelést. Ennek eredményeként lényegesen kevesebb kód tesztelhető és karbantartható.
7. Szigorúbb típusú rendszer
Már megvizsgáltuk, hogy az Unió típusai hogyan adnak még egy rugalmassági réteget a PHP 8 típusú rendszerhez. Ezen a területen számos további változás fokozza a típusellenőrzés szigorúságát és következetességét.
A szám-összehasonlítás húrja most józanabb. 0
(egész szám) már nem egyenértékű a következővel: ""
(üres karakterlánc) és összehasonlítások, mint pl 123 == "123abc"
értékelje most false
, nem true
. Ezek a változtatások segítenek csökkenteni az összehasonlítási hibák esélyét a kódbázisban, bár némi munkára lehet szükség a régi projektek kompatibilitásának biztosításához.
A típusrendszer szintén egyértelművé vált mixed
típus (annak jelzésére, hogy bármilyen érték kompatibilis), valamint a static
visszatérési típus (támogatja a késői statikus kötést). Másutt az absztrakt módszerek aláírásait a tulajdonságokban már megfelelően ellenőrzik.
Ezek a változtatások összességében elősegítik a PHP támogatását az erősen tipizált programozáshoz. A típusú tippek következetes használata kiküszöböli a hibákat, amelyek létezhetnek a gyengén beírt nyelveken, nagyobb biztonságot nyújtva a fejlesztők számára abban, hogy a kód rendeltetésszerűen működik.
8. JIT
A listánk utolsó bejegyzése inkább a kulisszák mögötti képesség, mint egy nyelvi jellemző. A PHP 8 támogatja a Just-In-Time fordítási támogatást, amely jelentősen növelheti a teljesítményt.
Az ismétlődő feladatokat futtató, hosszú ideje futó szkriptek részesülnek leginkább a JIT összeállításából. A referenciaértékek jelzik a javulás kevésbé lesz kifejezett a webes alkalmazásokban, ahol a PHP található leggyakrabban. A JIT hozzáadása hozzájárulhat ahhoz, hogy a PHP kiterjedjen a programozás más területeire is, növelve ezzel a nyelv általános vonzerejét és sokoldalúságát.
A JIT-et engedélyezni kell az új beállítások használatával a php.ini
konfigurációs fájl. Az elérhető értékekről és azok hatásairól részletes útmutatás található a dokumentáció; általános alapértelmezettként azonban a következőket javasoljuk:
<code>opcache.enable=1 opcache.jit_buffer_size=100M opcache.jit=1255</code>
Következtetés
Csak a nyolc legfontosabb kiegészítést és módosítást vizsgáltuk meg a PHP 8-ban. Érdemes átnézni a hivatalos kiadási megjegyzések mielőtt elkezdené használni a PHP 8-at a projektjeiben, mivel még számos apróbb funkció van, amelyeket itt nem tudtunk lefedni.
Noha a legtöbb változtatás visszamenőleg kompatibilis, a lehetséges gotchák tartalmazzák a típusrendszer-fejlesztéseket és a standard könyvtáron belüli változtatásokat. Megtalálhatja a teljes migrációs útmutató a PHP dokumentációs oldalán.