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.