Aktuální situace: PHP2Shell. Dvě kritické zranitelnosti PHP (CVSS 9.2) umožňují spustit škodlivý kód bez přihlášení. Záplaty od 21. 10. 2026.Co nyní udělat →

PHP 8.0 až 8.5: nejdůležitější novinky

Od match a JIT v PHP 8.0 po operátor pipe a rozšíření URI v PHP 8.5: novinky každé verze, úskalí při upgradu a co přinášejí pro bezpečnost.

Stav 4 min čteníZnalosti o PHP

Stručně: PHP 8.0 (listopad 2020) přineslo pojmenované argumenty, atributy, sjednocené typy (union types), match, operátor nullsafe a kompilátor JIT. Poté následovaly každoroční verze: 8.1 s enums a Fibers, 8.2 s třídami readonly, 8.3 s typovanými konstantami tříd, 8.4 s Property Hooks a 8.5 s operátorem pipe a rozšířením URI. Každá verze také označuje staré věci za zastaralé. Při upgradu proto záleží na testech a z hlediska bezpečnosti především na provozu podporované větve s aktuálním stavem záplat.

Novinky v PHP 8 v přehledu

Tabulka shrnuje hlavní body stránek vydání na php.net. Data prvního vydání podle php.net.

Verze Vydáno Nejdůležitější novinky Výběr zastaralých funkcí a zásadních změn
8.0 26. 11. 2020 pojmenované argumenty, atributy, Constructor Property Promotion, sjednocené typy, match, ?->, JIT 0 == 'foobar' je nyní false, chyby typů místo varování
8.1 25. 11. 2021 enums, vlastnosti readonly, First-Class Callables strlen(...), new v inicializátorech, typy průniku, never, Fibers –
8.2 8. 12. 2022 třídy readonly, typy DNF, null/false/true jako typy, rozšíření Random, konstanty v traitech, #[\SensitiveParameter] dynamické vlastnosti zastaralé
8.3 23. 11. 2023 typované konstanty tříd, #[\Override], json_validate(), mb_str_pad(), php -l pro více souborů –
8.4 21. 11. 2024 Property Hooks, asymetrická viditelnost, #[\Deprecated], nové API DOM s HTML5, BcMath\Number, array_find(), Lazy Objects implicitně nullable parametry zastaralé; IMAP, OCI8, PDO_OCI, pspell do PECL
8.5 20. 11. 2025 operátor pipe, rozšíření URI, Clone With, #[\NoDiscard], array_first()/array_last() operátor zpětného apostrofu zastaralý, disable_classes odstraněno

PHP 8.0 a 8.1: velký krok

PHP 8.0 udělalo jazyk znatelně přísnější a výraznější. Podle stránky vydání vyhazují interní funkce nyní důsledně TypeError nebo ValueError místo pouhých varování. Porovnávání čísel a řetězců se řídí čistšími pravidly.

<?php
// PHP 8.0: match porovnává striktně a nepotřebuje break
$status = 404;
echo match (true) {
    $status >= 500 => 'Serverfehler',
    $status >= 400 => 'Anfragefehler',
    default        => 'in Ordnung',
};

// PHP 8.0: operátor nullsafe
$land = $bestellung?->kunde?->adresse?->land;

PHP 8.1 přineslo enums, tedy výčtové typy s pevnými hodnotami, a vlastnosti readonly, které lze nastavit jen jednou:

<?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'));

Rolle::from() vyvolá chybu u neznámých hodnot. Zabrání to tomu, aby jako role proklouzly libovolné řetězce z formulářů. Kdo místo chyby potřebuje prázdnou hodnotu, použije Rolle::tryFrom(), které u neznámých hodnot vrací null.

Novinkou v 8.1 jsou také Fibers, základ pro souběžné procesy, na kterém stavějí knihovny pro asynchronní zpracování. V běžném provozu webu si jich lze sotva všimnout, v moderních frameworcích a frontách úloh však ano.

PHP 8.2 a 8.3: úklid a zabezpečení

PHP 8.2 označilo dynamické vlastnosti za zastaralé. Kdo přiřadí objektu nedeklarovanou vlastnost, dostane upozornění; pomocí #[\AllowDynamicProperties] to lze pro jednotlivé třídy povolit. Starší pluginy proto často vytvářejí mnoho hlášení v logu.

Pro bezpečnost jsou zajímavé nové rozšíření Random, jehož výchozí randomizer používá podle stránky vydání kryptograficky bezpečný generátor náhodných čísel, a atribut #[\SensitiveParameter], který skrývá hodnoty jako hesla ve stack tracích. Více o bezpečných náhodných hodnotách v článku Bezpečná náhodná čísla a tokeny v PHP.

PHP 8.3 přidalo typované konstanty tříd, atribut #[\Override] proti překlepům při přepisování metod a json_validate(), které kontroluje JSON, aniž by jej úplně dekódovalo.

PHP 8.4 a 8.5: moderní jazykové prostředky

PHP 8.4 zavedlo Property Hooks, tedy logiku přímo u vlastností, a asymetrickou viditelnost jako public private(set). K tomu přibylo nové API DOM s podporou HTML5 a funkce jako array_find(), array_any() a array_all(). Podle stránky vydání byla rozšíření IMAP, OCI8, PDO_OCI a pspell přesunuta z jádra do PECL. Aplikace, které například používají IMAP, pak potřebují samostatný balíček.

PHP 8.5 přineslo operátor pipe, který řetězí volání zleva doprava:

<?php
$slug = '  Neue Produkte 2026  '
    |> trim(...)
    |> strtolower(...)
    |> (fn(string $s): string => str_replace(' ', '-', $s));
// Výsledek: "neue-produkte-2026"

Novinkou je také rozšíření URI, které rozkládá adresy podle RFC 3986 a standardu WHATWG URL. Z hlediska bezpečnosti je to relevantní, protože nejednotně zpracovávané adresy URL jsou známou příčinou obejitých kontrol. Operátor zpětného apostrofu jako zkrácená forma shell_exec() je zastaralý, nastavení disable_classes bylo odstraněno. Kdo je používal, měl by upravit své zpevnění.

Novinky, upgrady a PHP2Shell

Nové jazykové funkce zranitelnosti v interpretu neuzavírají. Proti PHP2Shell pomáhá jen aktuální stav záplat dané větve: 8.5.12, 8.4.27, 8.3.36 nebo 8.2.35. Pro PHP 8.1 a 8.0 už oficiální aktualizace neexistují. Kdo tam uvízl, musí upgradovat, a přitom novinky pomáhají málo, zásadní změny naopak hodně.

Bezpečný postup upgradu v pěti krocích:

  1. Stanovit cílovou verzi, odpovídající systémovým požadavkům výrobce a cyklu vydávání.
  2. Závislosti přes Composer a pluginy převést na kompatibilní verze.
  3. Kód ověřit statickou analýzou a testy proti cílové verzi.
  4. Vyzkoušet v testovacím prostředí s kopií produkčních dat, vyhodnotit logy z hlediska zastaralých funkcí.
  5. Přepnout, restartovat všechny procesy PHP a zdokumentovat stav.

Souvislosti k typům nabízí článek Typový systém PHP.

Jak konkrétně pomáhá PHP SOS?

  • Ověřit kompatibilitu: Analyzujeme váš kód a rozšíření z hlediska zásadních změn vůči cílové verzi.
  • Provést upgrade: Prostřednictvím migrace na podporovanou verzi PHP převedeme aplikace otestovaně na vyšší verzi.
  • Upravit zpevnění: Odstraněná nastavení jako disable_classes nahradíme účinnými alternativami.
  • Udržovat stav záplat: Po upgradu udržujeme větev aktuální a doložíme každý restart.

Časté dotazy

Kterou verzi PHP 8 bych měl dnes nasadit?

Pro nové projekty PHP 8.4 nebo 8.5, protože jsou podporovány nejdéle: 8.4 do konce roku 2028, 8.5 do konce roku 2029. Rozhodující je, co vaše aplikace podle systémových požadavků výrobce podporuje. PHP 8.2 končí 31. prosince 2026.

Co se při přechodu z PHP 7.4 na PHP 8 rozbíjí nejčastěji?

Často jde o přísnější kontroly typů: interní funkce v PHP 8 vyhazují TypeError nebo ValueError místo pouhého vypsání varování. Nápadné jsou i změněné porovnávání čísel a řetězců. Statická analýza a testy odhalí většinu předem.

Zrychlí JIT můj web?

Většinou sotva. Podle stránky vydání PHP 8.0 je výkon typických webových aplikací zhruba na úrovni PHP 7.4, zatímco výpočetně náročné úlohy mohou výrazně profitovat. Od PHP 8.4 je JIT standardně vypnutý.

Které novinky pomáhají bezpečnosti?

Mimo jiné nové rozšíření Random v PHP 8.2 s kryptograficky bezpečným výchozím nastavením, atribut SensitiveParameter proti heslům ve stack tracích, enums a vlastnosti readonly pro jednoznačnější data a důslednější chyby typů od PHP 8.0.

Zdroje

Okamžitý kontakt

Každá hodina se počítá. Napište nám hned.

Stručně popište systém, verzi PHP a pozorování. Ozveme se, vyjasníme situaci a budeme pracovat na dálku, dokud nebude incident uzavřen a zdokumentován.

Okamžitá pomoc