Aktualna sytuacja: PHP2Shell. Dwie krytyczne luki w PHP (CVSS 9,2) umożliwiają wykonanie złośliwego kodu bez logowania. Poprawki od 21.10.2026.Co należy teraz zrobić →

PHP 8.0 do 8.5: najważniejsze nowości

Od match i JIT w PHP 8.0 po operator pipe i rozszerzenie URI w PHP 8.5: nowości każdej wersji, pułapki przy aktualizacji i to, co dają dla bezpieczeństwa.

Stan 4 min czytaniaWiedza o PHP

Krótko: PHP 8.0 (listopad 2020) przyniosło nazwane argumenty, atrybuty, typy unijne, match, operator nullsafe i kompilator JIT. Potem co roku: 8.1 z enumami i Fibers, 8.2 z klasami readonly, 8.3 z typowanymi stałymi klas, 8.4 z Property Hooks, a 8.5 z operatorem pipe i rozszerzeniem URI. Każda wersja wycofuje także coś starego. Przy aktualizacji liczą się więc testy, a dla bezpieczeństwa przede wszystkim prowadzenie wspieranej gałęzi z aktualnym stanem poprawek.

Nowości w PHP 8 w skrócie

Tabela zbiera najważniejsze punkty ze stron wydań na php.net. Daty pierwszego wydania według php.net.

Wersja Wydana Najważniejsze nowości Wybór wycofań i zmian niezgodnych
8.0 26.11.2020 nazwane argumenty, atrybuty, Constructor Property Promotion, typy unijne, match, ?->, JIT 0 == 'foobar' jest teraz false, błędy typów zamiast ostrzeżeń
8.1 25.11.2021 enumy, właściwości readonly, First-Class-Callables strlen(...), new w inicjalizatorach, typy przecięcia, never, Fibers –
8.2 08.12.2022 klasy readonly, typy DNF, null/false/true jako typy, rozszerzenie Random, stałe w traitach, #[\SensitiveParameter] wycofane właściwości dynamiczne
8.3 23.11.2023 typowane stałe klas, #[\Override], json_validate(), mb_str_pad(), php -l dla wielu plików –
8.4 21.11.2024 Property Hooks, asymetryczna widoczność, #[\Deprecated], nowe API DOM z HTML5, BcMath\Number, array_find(), Lazy Objects wycofane parametry domyślnie dopuszczające null; IMAP, OCI8, PDO_OCI, pspell przeniesione do PECL
8.5 20.11.2025 operator pipe, rozszerzenie URI, Clone With, #[\NoDiscard], array_first()/array_last() wycofany operator backtick, usunięte disable_classes

PHP 8.0 i 8.1: wielki krok

PHP 8.0 uczyniło język wyraźnie ostrzejszym i bardziej wyrazistym. Według strony wydania funkcje wewnętrzne zgłaszają teraz konsekwentnie TypeError lub ValueError zamiast tylko wypisywać ostrzeżenia. Porównania między liczbami a ciągami znaków podlegają czytelniejszym regułom.

<?php
// PHP 8.0: match porównuje ściśle i nie potrzebuje break
$status = 404;
echo match (true) {
    $status >= 500 => 'Serverfehler',
    $status >= 400 => 'Anfragefehler',
    default        => 'in Ordnung',
};

// PHP 8.0: operator nullsafe
$land = $bestellung?->kunde?->adresse?->land;

PHP 8.1 przyniosło enumy, czyli typy wyliczeniowe o stałych wartościach, oraz właściwości readonly, które można ustawić tylko raz:

<?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() zgłasza błąd przy nieznanych wartościach. Zapobiega to przedostaniu się dowolnych ciągów znaków z formularzy jako roli. Kto zamiast błędu potrzebuje pustej wartości, używa Rolle::tryFrom(), które przy nieznanych wartościach zwraca null.

Nowością w 8.1 są też Fibers, podstawa dla przebiegów współbieżnych, na której opierają się biblioteki do przetwarzania asynchronicznego. W zwykłej eksploatacji strony niewiele się to zauważa, natomiast w nowoczesnych frameworkach i kolejkach już tak.

PHP 8.2 i 8.3: porządkowanie i zabezpieczanie

PHP 8.2 wycofało właściwości dynamiczne. Kto przypisze obiektowi niezadeklarowaną właściwość, otrzymuje uwagę; przez #[\AllowDynamicProperties] można to dopuścić dla pojedynczych klas. Starsze wtyczki generują dlatego często wiele komunikatów w dzienniku.

Dla bezpieczeństwa interesujące są nowe rozszerzenie Random, którego domyślny randomizer według strony wydania używa kryptograficznie bezpiecznego generatora losowego, oraz atrybut #[\SensitiveParameter], który ukrywa wartości, takie jak hasła, w stacktrace. Więcej o bezpiecznych wartościach losowych na stronie Bezpieczne liczby losowe i tokeny w PHP.

PHP 8.3 dodało typowane stałe klas, atrybut #[\Override] przeciw literówkom przy nadpisywaniu metod oraz json_validate(), które sprawdza JSON bez pełnego dekodowania.

PHP 8.4 i 8.5: nowoczesne środki języka

PHP 8.4 wprowadziło Property Hooks, czyli logikę bezpośrednio przy właściwościach, oraz asymetryczną widoczność, taką jak public private(set). Doszły nowe API DOM z obsługą HTML5 i funkcje takie jak array_find(), array_any() i array_all(). Według strony wydania rozszerzenia IMAP, OCI8, PDO_OCI i pspell zostały przeniesione z rdzenia do PECL. Aplikacje, które używają na przykład IMAP, potrzebują wtedy osobnego pakietu.

PHP 8.5 przyniosło operator pipe, który łączy wywołania od lewej do prawej:

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

Nowością jest także rozszerzenie URI, które rozbiera adresy według RFC 3986 i standardu WHATWG URL. Ma to znaczenie dla bezpieczeństwa, ponieważ niejednolicie parsowane adresy URL są znaną przyczyną obchodzenia kontroli. Operator backtick jako skrót shell_exec() jest wycofany, a ustawienie disable_classes usunięto. Kto go używał, powinien dostosować swoje utwardzanie.

Nowości, aktualizacje i PHP2Shell

Nowe funkcje języka nie zamykają luk w interpreterze. Przeciw PHP2Shell pomaga tylko aktualny stan poprawek danej gałęzi: 8.5.12, 8.4.27, 8.3.36 lub 8.2.35. Dla PHP 8.1 i 8.0 nie ma już oficjalnych aktualizacji. Kto tam utknął, musi przejść na nowszą wersję, a przy tym nowości pomagają niewiele, natomiast zmiany niezgodne bardzo.

Bezpieczna droga aktualizacji w pięciu krokach:

  1. Ustalić wersję docelową, zgodną z wymaganiami systemowymi producenta i z cyklem wydawniczym.
  2. Doprowadzić zależności przez Composera i wtyczki do zgodnych stanów.
  3. Sprawdzić kod analizą statyczną i testami względem wersji docelowej.
  4. Wypróbować w środowisku testowym z kopią danych produkcyjnych, przeanalizować dzienniki pod kątem wycofań.
  5. Przełączyć, zrestartować wszystkie procesy PHP i udokumentować stan.

Tło dotyczące typów podaje strona System typów PHP.

Jak konkretnie pomaga PHP SOS?

  • Sprawdzenie zgodności: Analizujemy Państwa kod i rozszerzenia pod kątem niezgodności z wersją docelową.
  • Przeprowadzenie aktualizacji: W ramach migracji na wspieraną wersję PHP podnosimy aplikacje z testami.
  • Dostosowanie utwardzania: Zastępujemy usunięte ustawienia, takie jak disable_classes, skutecznymi alternatywami.
  • Utrzymanie stanu poprawek: Po aktualizacji utrzymujemy gałąź w aktualnym stanie i dokumentujemy każdy restart.

Częste pytania

Którą wersję PHP 8 powinienem dziś stosować?

W nowych projektach PHP 8.4 lub 8.5, ponieważ są wspierane najdłużej: 8.4 do końca 2028 roku, 8.5 do końca 2029 roku. Rozstrzygające jest to, co Państwa aplikacja obsługuje według wymagań systemowych producenta. PHP 8.2 kończy się 31 grudnia 2026 roku.

Co najczęściej przestaje działać przy przejściu z PHP 7.4 na PHP 8?

Często są to ostrzejsze kontrole typów: funkcje wewnętrzne w PHP 8 zgłaszają TypeError lub ValueError zamiast tylko wypisywać ostrzeżenia. Zwracają uwagę także zmienione porównania między liczbami a ciągami znaków. Analiza statyczna i testy wykrywają większość z góry.

Czy JIT przyspieszy moją stronę?

Zwykle ledwo. Według strony wydania PHP 8.0 wydajność typowych aplikacji webowych jest mniej więcej na poziomie PHP 7.4, podczas gdy zadania wymagające dużej mocy obliczeniowej mogą wyraźnie zyskać. Od PHP 8.4 JIT jest domyślnie wyłączony.

Które nowości pomagają bezpieczeństwu?

Między innymi nowe rozszerzenie Random w PHP 8.2 z kryptograficznie bezpiecznym ustawieniem domyślnym, atrybut SensitiveParameter przeciw hasłom w stacktrace, enumy i właściwości readonly dla jednoznaczniejszych danych oraz bardziej konsekwentne błędy typów od PHP 8.0.

Źródła

Kontakt natychmiast

Liczy się każda godzina. Proszę napisać do nas teraz.

Proszę krótko opisać system, wersję PHP i obserwacje. Skontaktujemy się z Państwem, ustalimy sytuację i będziemy pracować zdalnie, aż incydent zostanie zamknięty i udokumentowany.

Natychmiastowa pomoc