Röviden: A PHP 8.0 (2020. november) elnevezett argumentumokat, attribútumokat, uniótípusokat, match-et, a nullsafe operátort és egy JIT-fordítót hozott. Ezután évente követték: a 8.1 enumokkal és Fiberekkel, a 8.2 readonly osztályokkal, a 8.3 típusos osztálykonstansokkal, a 8.4 property hookokkal és a 8.5 pipe operátorral és URI-bővítménnyel. Minden verzió régi dolgokat is elavulttá nyilvánít. Frissítéskor ezért a tesztek számítanak, a biztonság szempontjából pedig mindenekelőtt az, hogy támogatott ágat üzemeltessen naprakész patch-állapottal.
A PHP 8 újdonságai áttekintve
A táblázat a php.net kiadási oldalainak fő pontjait foglalja össze. Az első kiadás dátumai a php.net szerint.
| Verzió | Megjelent | Legfontosabb újdonságok | Válogatás az elavulásokból és törésekből |
|---|---|---|---|
| 8.0 | 2020. 11. 26. | elnevezett argumentumok, attribútumok, Constructor Property Promotion, uniótípusok, match, ?->, JIT |
a 0 == 'foobar' most false, típushibák figyelmeztetések helyett |
| 8.1 | 2021. 11. 25. | enumok, readonly tulajdonságok, first-class callable-ök strlen(...), new inicializálókban, metszettípusok, never, Fiberek |
– |
| 8.2 | 2022. 12. 08. | readonly osztályok, DNF-típusok, null/false/true típusként, Random bővítmény, konstansok trait-ekben, #[\SensitiveParameter] |
a dinamikus tulajdonságok elavultak |
| 8.3 | 2023. 11. 23. | típusos osztálykonstansok, #[\Override], json_validate(), mb_str_pad(), php -l több fájlra |
– |
| 8.4 | 2024. 11. 21. | property hookok, aszimmetrikus láthatóság, #[\Deprecated], új DOM API HTML5-tel, BcMath\Number, array_find(), lazy objektumok |
az implicit nullable paraméterek elavultak; IMAP, OCI8, PDO_OCI, pspell átkerült a PECL-be |
| 8.5 | 2025. 11. 20. | pipe operátor, URI-bővítmény, Clone With, #[\NoDiscard], array_first()/array_last() |
a backtick operátor elavult, a disable_classes eltávolítva |
PHP 8.0 és 8.1: a nagy lépés
A PHP 8.0 érezhetően szigorúbbá és kifejezőbbé tette a nyelvet. A kiadási oldal szerint a belső függvények mostantól következetesen TypeError vagy ValueError kivételt dobnak, ahelyett, hogy csak figyelmeztetést adnának. A számok és karakterláncok közötti összehasonlítások tisztább szabályokat követnek.
<?php
// PHP 8.0: a match szigorúan hasonlít össze, és nem kell break
$status = 404;
echo match (true) {
$status >= 500 => 'Serverfehler',
$status >= 400 => 'Anfragefehler',
default => 'in Ordnung',
};
// PHP 8.0: nullsafe operátor
$land = $bestellung?->kunde?->adresse?->land;
A PHP 8.1 enumokat hozott, vagyis rögzített értékű felsorolási típusokat, és readonly tulajdonságokat, amelyek csak egyszer állíthatók be:
<?php
enum Rolle: string {
case Leser = 'leser';
case Redakteur = 'redakteur';
case Admin = 'admin';
}
final class Benutzer {
public function __construct(
public readonly string $name,
public readonly Rolle $rolle,
) {}
}
$b = new Benutzer('Erika', Rolle::from('redakteur'));
A Rolle::from() ismeretlen értékeknél hibát dob. Ez megakadályozza, hogy az űrlapokból tetszőleges karakterláncok szerepként átcsússzanak. Aki hiba helyett üres értéket szeretne, a Rolle::tryFrom() függvényt használja, amely ismeretlen értékeknél null-t ad vissza.
A 8.1-ben újak a Fiberek is, a párhuzamos folyamatok alapja, amelyre az aszinkron feldolgozás programkönyvtárai épülnek. A rendes weboldal-üzemben ebből kevés tűnik fel, a modern keretrendszerekben és üzenetsorokban viszont igen.
PHP 8.2 és 8.3: takarítás és biztosítás
A PHP 8.2 elavulttá nyilvánította a dinamikus tulajdonságokat. Aki egy objektumnak nem deklarált tulajdonságot ad értékül, figyelmeztetést kap; a #[\AllowDynamicProperties] segítségével ez egyes osztályokra engedélyezhető. A régebbi bővítmények ezért gyakran sok üzenetet generálnak a naplóban.
A biztonság szempontjából érdekes az új Random bővítmény, amelynek alapértelmezett randomizere a kiadási oldal szerint kriptográfiailag biztonságos véletlenszám-generátort használ, és a #[\SensitiveParameter] attribútum, amely elrejti az olyan értékeket, mint a jelszavak, a stack trace-ekben. A biztonságos véletlen értékekről bővebben a Biztonságos véletlenszámok és tokenek PHP-ban cikkben olvashat.
A PHP 8.3 típusos osztálykonstansokkal, a metódusok felülírásakor elírások ellen védő #[\Override] attribútummal és a json_validate() függvénnyel bővült, amely a JSON-t teljes dekódolás nélkül ellenőrzi.
PHP 8.4 és 8.5: modern nyelvi eszközök
A PHP 8.4 bevezette a property hookokat, vagyis a logikát közvetlenül a tulajdonságoknál, és az aszimmetrikus láthatóságot, például a public private(set) formát. Ehhez jött egy új, HTML5-támogatású DOM API és olyan függvények, mint az array_find(), az array_any() és az array_all(). A kiadási oldal szerint az IMAP, OCI8, PDO_OCI és pspell bővítményeket kivették a magból, és a PECL-be helyezték át. Az IMAP-ot is használó alkalmazásoknak ezután külön csomag kell.
A PHP 8.5 hozta a pipe operátort, amely balról jobbra láncolja a hívásokat:
<?php
$slug = ' Neue Produkte 2026 '
|> trim(...)
|> strtolower(...)
|> (fn(string $s): string => str_replace(' ', '-', $s));
// Eredmény: "neue-produkte-2026"
Új az URI-bővítmény is, amely a címeket az RFC 3986 és a WHATWG URL szabvány szerint bontja elemeire. Ez biztonsági szempontból releváns, mert az egyenetlenül elemzett URL-ek a megkerült ellenőrzések ismert oka. A backtick operátor, a shell_exec() rövid formája, elavult, a disable_classes beállítást eltávolították. Aki használta, igazítsa a megerősítését.
Újdonságok, frissítések és PHP2Shell
Az új nyelvi funkciók nem zárják be az értelmezőben lévő réseket. A PHP2Shell ellen csak az adott ág aktuális patch-állapota segít: 8.5.12, 8.4.27, 8.3.36 vagy 8.2.35. A PHP 8.1-hez és a 8.0-hoz már nincs hivatalos frissítés. Aki ott ragadt, annak frissítenie kell, és ebben az újdonságok keveset segítenek, a törések viszont sokat számítanak.
Egy biztonságos frissítési út öt lépésben:
- A célverzió kijelölése a gyártó rendszerkövetelményeinek és a kiadási ciklusnak megfelelően.
- A függőségek Composeren keresztül és a bővítmények kompatibilis állapotra hozása.
- A kód ellenőrzése a célverzióval szemben statikus elemzéssel és tesztekkel.
- Kipróbálás tesztkörnyezetben az éles adatok másolatával, a naplók kiértékelése elavulások után.
- Átállás, az összes PHP-folyamat újraindítása és az állapot dokumentálása.
A típusokról háttérinformációt nyújt A PHP típusrendszere.
Hogyan segít konkrétan a PHP SOS?
- Kompatibilitás ellenőrzése: Elemezzük a kódját és a bővítményeit a célverzióval szembeni törések szempontjából.
- Frissítés végrehajtása: A támogatott PHP-verzióra való migrációval az alkalmazásokat tesztelten emeljük följebb.
- A megerősítés igazítása: Az eltávolított beállításokat, például a
disable_classes-t hatásos alternatívákkal váltjuk fel. - A patch-állapot fenntartása: A frissítés után naprakészen tartjuk az ágat, és igazoljuk minden újraindítást.
Gyakori kérdések
Melyik PHP 8-verziót használjam ma?
Új projektekhez a PHP 8.4-et vagy a 8.5-öt, mert ezeket támogatják a legtovább: a 8.4-et 2028 végéig, a 8.5-öt 2029 végéig. Döntő, hogy az alkalmazása a gyártó rendszerkövetelményei szerint mit támogat. A PHP 8.2 2026. december 31-én ér véget.
Mi romlik el leggyakrabban a PHP 7.4-ről a PHP 8-ra váltáskor?
Gyakran a szigorúbb típusellenőrzések: a belső függvények a PHP 8-ban TypeError vagy ValueError kivételt dobnak, ahelyett, hogy csak figyelmeztetést adnának. A számok és karakterláncok közötti megváltozott összehasonlítások is feltűnnek. A statikus elemzés és a tesztek a legtöbbet előre kiderítik.
Gyorsabbá teszi a JIT a weboldalamat?
Többnyire alig. A PHP 8.0 kiadási oldala szerint a tipikus webalkalmazások teljesítménye nagyjából a PHP 7.4 szintjén van, a számításigényes feladatok viszont jelentősen profitálhatnak. A PHP 8.4 óta a JIT alapértelmezetten ki van kapcsolva.
Mely újdonságok segítik a biztonságot?
Többek között a PHP 8.2 új Random bővítménye kriptográfiailag biztonságos alapértelmezéssel, a SensitiveParameter attribútum a jelszavak ellen a stack trace-ekben, az enumok és a readonly tulajdonságok egyértelműbb adatokért, valamint a PHP 8.0 óta következetesebb típushibák.