Programování

Novinky PHP 8.0 až 8.4 v praxi: co používat v každodenním kódu

Přehled užitečných novinek PHP 8.x s příklady: match, nullsafe operátor, enumy, readonly, pojmenované argumenty, property hooks a co si pohlídat při upgradu.

12. 10. 2026 · 4 min čtení

Pokud jste naposledy psali PHP ve verzi 7, moderní PHP vám bude připadat jako jiný jazyk. Řada 8.x přinesla funkce, které zkracují kód a zachytí chyby dřív. Tady je výběr toho, co se opravdu hodí v běžném projektu, seřazený podle verze, ve které to přibylo.

PHP 8.0

match

Náhrada za switch, která vrací hodnotu, porovnává striktně (===) a nepropadá do dalších větví:

$label = match ($status) {
    'new' => 'Nová',
    'paid', 'shipped' => 'Zpracovává se',
    'cancelled' => 'Zrušená',
};

Pokud žádná větev nesedí a chybí default, vyhodí UnhandledMatchError. To je výhoda – nová hodnota stavu neprojde potichu.

Nullsafe operátor

// dříve
$city = $user !== null && $user->getAddress() !== null
    ? $user->getAddress()->city
    : null;

// PHP 8
$city = $user?->getAddress()?->city;

Pojmenované argumenty

setcookie('sid', $id, httponly: true, secure: true, samesite: 'Lax');

Nemusíte vyplňovat všechny parametry před tím, který potřebujete. Pozor: názvy parametrů se tím stávají součástí veřejného API vašich funkcí.

Constructor property promotion

final class Money
{
    public function __construct(
        public int $amount,
        public string $currency = 'CZK',
    ) {}
}

Další

  • Union typy int|string, typ mixed, návratový typ static.
  • Funkce str_contains(), str_starts_with(), str_ends_with().
  • Atributy #[Route('/api')] místo anotací v komentářích.
  • JIT kompilátor (přínos hlavně pro výpočetně náročný kód, ne typické weby).

PHP 8.1

Enumy

enum OrderStatus: string
{
    case New = 'new';
    case Paid = 'paid';
    case Cancelled = 'cancelled';

    public function label(): string
    {
        return match ($this) {
            self::New => 'Nová',
            self::Paid => 'Zaplacená',
            self::Cancelled => 'Zrušená',
        };
    }
}

$status = OrderStatus::from('paid');      // ValueError při neplatné hodnotě
$maybe  = OrderStatus::tryFrom('foo');    // null
echo $status->label();

Enumy nahrazují konstanty a řetězce rozházené po kódu. Laravel i Doctrine je umí přímo mapovat na sloupec v databázi.

Readonly vlastnosti

final class User
{
    public function __construct(public readonly int $id) {}
}

Vlastnost lze nastavit jen jednou, při pokusu o změnu vznikne Error.

Další

  • Typ never pro funkce, které nikdy nevrátí (vždy vyhodí výjimku nebo ukončí skript).
  • First-class callable syntax: $fn = strlen(...);.
  • new v inicializátorech parametrů.
  • Fibers (využívají je asynchronní knihovny, v aplikačním kódu je přímo nepotřebujete).

PHP 8.2

  • Readonly třídy: readonly class Point { ... } – všechny vlastnosti jsou readonly.
  • Typy null, true, false samostatně a DNF typy (A&B)|null.
  • Atribut #[\SensitiveParameter] – hodnota parametru se nezobrazí ve stack trace. Ideální pro hesla:
function login(string $email, #[\SensitiveParameter] string $password) { ... }
  • Zastaralé dynamické vlastnosti – přiřazení do nedeklarované vlastnosti vyhodí deprecation. Při upgradu je to nejčastější zdroj varování.

PHP 8.3

  • Typované konstanty tříd: const string VERSION = '1.0';
  • Atribut #[\Override] – PHP ověří, že metoda opravdu přepisuje metodu rodiče. Odhalí překlepy a změny v rodičovské třídě.
  • json_validate() – ověří JSON bez dekódování do paměti.
  • Dynamický přístup ke konstantám: Foo::{$name}.

PHP 8.4

  • Property hooks – logika get/set přímo u vlastnosti, bez getterů a setterů:
class Product
{
    public string $name {
        set => trim($value);
    }
}
  • Asymetrická viditelnost: public private(set) string $email; – číst může každý, zapisovat jen třída.
  • new bez závorek: new Foo()->bar().
  • Funkce pro pole array_find(), array_any(), array_all().
  • Atribut #[\Deprecated] pro vlastní funkce.

Na co si dát pozor při upgradu

  1. Zjistěte aktuální verzi a podporované verze frameworku (php -v, composer.json).
  2. Statická analýza – PHPStan nebo Psalm najdou většinu problémů dřív než produkce.
  3. Rector umí automaticky přepsat kód na nové konstrukce i opravit nekompatibility:
composer require --dev rector/rector
vendor/bin/rector init
vendor/bin/rector process src --dry-run
  1. Změny chování v 8.0: porovnání čísla s nečíselným řetězcem (0 == 'abc' je nyní false), řada funkcí místo varování vyhazuje TypeError nebo ValueError.
  2. Zapněte zobrazení deprecations ve vývoji (error_reporting = E_ALL) – co je dnes deprecated, bude v PHP 9 chyba.

Kterou verzi používat

Držte se verze, která má ještě aktivní nebo alespoň bezpečnostní podporu – aktuální přehled je na php.net/supported-versions. Verze 8.0 a 8.1 už podporu nemají, 8.2 dostává jen bezpečnostní opravy. Pro nové projekty volte nejnovější stabilní verzi, kterou podporuje váš framework a hosting.

Při upgradu většího projektu se vyplatí nahrát kód do ColdHost AI jako projekt a nechat si v režimu Programování projít nekompatibility soubor po souboru; změny pak odešlete jako pull request a zkontrolujete v CI.