HEAPS

PHP 8.5: co nowego i co warto wdrożyć od razu

PHP 8.5 dodaje pipe operator, rozszerzenie URI, clone with i #[\NoDiscard]. Co warto wdrożyć najpierw, a co może poczekać.

PHP 8.5 jest już na produkcji. Co z tego wynika?

PHP 8.5 wyszło w listopadzie 2025. Po kilku point release’ach większość teamów może przestać czekać. Jeśli siedzisz jeszcze na 8.3 albo 8.4, poniżej: które nowości skracają kod, a które spokojnie odłożysz.

Pipe operator |>

To zmiana, którą od razu widać w reviewach. Zamiast zagnieżdżać wywołania od środka, czytasz przepływ danych od lewej do prawej.

$title = ' PHP 8.5 Released ';

$slug = $title
    |> trim(...)
    |> (fn (string $str): string => str_replace(' ', '-', $str))
    |> (fn (string $str): string => str_replace('.', '', $str))
    |> strtolower(...);

Nie musisz wprowadzać tego wszędzie. Najlepiej wchodzi w małych transformacjach stringów, filtrach kolekcji i miejscach, gdzie wcześniej powstawał łańcuch tymczasowych zmiennych tylko po to, żeby ktoś za miesiąc zrozumiał intencję.

Rozszerzenie URI zamiast parse_url()

parse_url() nadal działa, ale przy walidacji URL-i z zewnętrznego inputu szybko robi się krucho. PHP 8.5 dokłada natywne API zgodne z RFC 3986 i WHATWG URL.

use Uri\Rfc3986\Uri;

$uri = new Uri('https://example.com/path?q=1');
$host = $uri->getHost(); // example.com

W API, webhookach i redirectach to ma znaczenie: mniej ręcznego sklejania stringów, mniej edge case’ów przy query stringach i fragmentach.

clone() z podmianą właściwości

Readonly classes lubią wzorzec „withX”. Do tej pory często kończyło się na get_object_vars() albo ręcznym kopiowaniu pól. Teraz wystarczy:

readonly class Color
{
    public function __construct(
        public int $red,
        public int $green,
        public int $blue,
        public int $alpha = 255,
    ) {}

    public function withAlpha(int $alpha): self
    {
        return clone($this, [
            'alpha' => $alpha,
        ]);
    }
}

Value objecty robią się krótsze i mniej podatne na literówki przy kopiowaniu stanu.

#[\NoDiscard] przy API, które łatwo zignorować

Zwracasz wynik, a caller go nie używa? W PHP 8.5 możesz to oznaczyć atrybutem i dostać ostrzeżenie.

#[\NoDiscard]
function normalizeEmail(string $email): string
{
    return strtolower(trim($email));
}

normalizeEmail('[email protected]');
// Warning: wartość zwracana powinna zostać użyta

Świetne w bibliotekach wewnętrznych, gdzie „ciche” ignorowanie wyniku zwykle oznacza bug, a nie świadomą decyzję. Świadome pominięcie załatwiasz castem (void).

Drobniejsze zmiany

array_first() i array_last() kończą rytuał z array_key_first() / array_key_last(). Fatal errore dostają backtrace, więc debug produkcji boli mniej. Persistent cURL share handles pomagają, gdy ten sam proces FPM często gada z tymi samymi hostami.

Kiedy aktualizować

Jeśli masz Symfony 8.x, PHP 8.4+ i tak jest na stole, więc skok do 8.5 jest naturalny. Przy Laravelu i starszych bundle’ach sprawdź Composer przed migracją, nie po. Na hostingu współdzielonym upewnij się, że provider już wystawił 8.5 ze wsparciem OPcache i poprawnym php.ini.

PHP 8.5 nie zmienia modelu aplikacji. Skraca codzienny kod i domyka miejsca, w których PHP wyglądało na starsze niż jest. Przy testach i CI aktualizacja zwykle przechodzi bez dramatu.