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.
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, typmixed, návratový typstatic. - 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
neverpro funkce, které nikdy nevrátí (vždy vyhodí výjimku nebo ukončí skript). - First-class callable syntax:
$fn = strlen(...);. newv 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,falsesamostatně 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/setpří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. newbez 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
- Zjistěte aktuální verzi a podporované verze frameworku (
php -v,composer.json). - Statická analýza – PHPStan nebo Psalm najdou většinu problémů dřív než produkce.
- 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
- 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í vyhazujeTypeErrorneboValueError. - 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.