Bahnhofstraße 22, 52134 Herzogenrath Poniedziałek - piątek: 8:00 - 16:30 kontakt@milnersoftware.de 0176 66798849

Aktualności · PHP · · 3 min czytania

„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.

Startseite von Shuttle Service Hoffmann: «Ihr persönlicher Chauffeur & Shuttle Service» neben einem schwarzen Van

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ą NULL trafia do PHP jako null, np. brak nazwy firmy u klienta.
  • Brakujące pola formularza. $_POST['telefon'] ?? null albo 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.

Autor: Przemysław Milner

Pozostałe wpisy