„Passing null to parameter of type string is deprecated” – co oznacza i jak naprawić
Od PHP 8.1 ten komunikat zapycha logi błędów wielu stron. Co oznacza, dlaczego w przyszłości może stać się prawdziwym błędem i jak poprawnie poprawić kod.
W skrócie: od PHP 8.1 PHP ostrzega, gdy wbudowanej funkcji, takiej jak strlen(), trim() czy htmlspecialchars(), przekazuje się wartość null, choć oczekuje ona tekstu. Strona na razie działa, to tylko ostrzeżenie (Deprecated). Rozwiązanie polega na tym, żeby we wskazanym miejscu zawsze trafiał tekst, zwykle przez ?? ''. Ukrywanie komunikatu tylko odsuwa problem.
Pełny komunikat wygląda na przykład tak:
Deprecated: trim(): Passing null to parameter #1 ($string) of type string
is deprecated in /var/www/html/inc/klienci.php on line 87
Pojawia się zwykle zaraz po przejściu na PHP 8.1 lub nowsze, i to nie raz, ale tysiące razy. Logi błędów rosną wtedy w kilka dni do kilku gigabajtów, a niektórzy hostingodawcy blokują stronę, gdy zabraknie miejsca.
Co oznacza komunikat
Wbudowane funkcje PHP mają określone typy parametrów. trim() oczekuje tekstu (string). Do PHP 8.0 PHP po cichu zamieniał null na pusty tekst. Od PHP 8.1 takie zachowanie jest oznaczone jako przestarzałe. W którejś z kolejnych głównych wersji ma stać się prawdziwym błędem i wtedy strona przerwie działanie dokładnie w tych miejscach.
Skąd bierze się null
- Puste pola w bazie danych. Kolumna z wartością
NULLtrafia do PHP jakonull, np. brak nazwy firmy u klienta. - Brakujące pola formularza.
$_POST['telefon'] ?? nullalbo funkcje, które przy braku wartości zwracająnull. - Funkcje bez zwracanej wartości. Własna funkcja, która w jednej gałęzi niczego nie zwraca, daje
null. - Wtyczki i motywy. W WordPressie wiele takich komunikatów pochodzi z wtyczek, których jeszcze nie dostosowano do PHP 8.1.
Jak to naprawić
Komunikat podaje plik i linię. Tam, w zależności od przypadku, są trzy porządne rozwiązania:
1. Wartość domyślna przez ??
// przed
$nazwa = trim($klient['firma']);
// po
$nazwa = trim($klient['firma'] ?? '');
Operator ?? bierze prawą wartość, gdy lewa jest null albo nie istnieje. To najczęstsze i zwykle właściwe rozwiązanie.
2. Świadome sprawdzenie
if ($klient['firma'] !== null) {
$nazwa = trim($klient['firma']);
}
Ma sens, gdy brak wartości oznacza coś innego niż pusta wartość, np. gdy trzeba wtedy pokazać inny tekst.
3. Naprawa u źródła
Jeśli null pochodzi z własnej funkcji, niech funkcja zawsze zwraca tekst. Jeśli pochodzi z bazy, a pole nigdy nie powinno być puste, lepszym rozwiązaniem jest wartość domyślna w tabeli.
Czego nie robić
- Globalnie wyłączać komunikatów przez
error_reporting(E_ALL & ~E_DEPRECATED). Na produkcji i tak nie powinny być wyświetlane, ale w logu są potrzebne, żeby znaleźć te miejsca, zanim staną się błędami. - Ukrywać przez @.
@trim($x)chowa objaw, a kod staje się wolniejszy i mniej czytelny. - Wszędzie dopisywać (string). Ślepe
(string)działa, ale zakrywa przypadki, w których brak wartości jest tak naprawdę błędem.
Na stronach WordPress
Jeśli komunikat pochodzi z wp-content/plugins/… albo wp-content/themes/…, nie należy zmieniać kodu bezpośrednio, bo przy następnej aktualizacji zmiana zniknie. Najpierw trzeba zaktualizować wtyczkę albo motyw. Jeśli to nie pomaga, warto zgłosić błąd producentowi. Na produkcji takie ostrzeżenia powinny trafiać tylko do logu, nie na stronę. Jak bezpiecznie przenieść WordPressa na nowe PHP, opisuję w artykule Zmiana wersji PHP w WordPressie.
Profesjonalna pomoc
W starszych aplikacjach takich miejsc jest często kilkaset. Przechodzę je systematycznie, naprawiam u źródła i dbam o to, żeby kod przetrwał także kolejne wersje PHP. Więcej w usłudze naprawa błędów PHP: analiza za 150 € netto, naprawa od 290 € netto.