Deprecated: Passing null to parameter — что это значит и как убрать
Полный текст выглядит примерно так:
Deprecated: Passing null to parameter #1 ($string) of type string is deprecated in /home/site/public_html/bitrix/templates/main/header.php on line 42
Номер параметра, его имя и файл будут свои, смысл один: в функцию передали null там, где она ждёт строку.
Откуда это берётся
До PHP 8.1 язык молча превращал null в пустую строку. С 8.1 он об этом предупреждает, потому что в будущих версиях такой вызов станет ошибкой. На сайте с историей поводов много:
- свойство инфоблока не заполнено, а шаблон сразу передаёт значение в
trim(),htmlspecialchars()илиstrlen(); - параметр компонента не задан, и его значение уходит в функцию обработки строк;
- поле пользователя пустое, а код считает, что там всегда что-то есть.
Как починить
Правка всегда одна и та же: привести значение к строке до вызова функции.
- Найдите строку из сообщения — файл и номер строки там указаны точно.
- Посмотрите, какое значение уходит в функцию и почему оно может быть пустым.
- Подставьте пустую строку по умолчанию: вместо
trim($value)напишитеtrim((string)$value), либо$value ?? ''. - Повторите для остальных мест — обычно их немного, просто вызываются часто.
Если сообщение указывает на файл внутри /bitrix/modules/, править его руками нельзя: правка исчезнет при обновлении. Для модулей вендора нужно обновление продукта, для модулей Маркетплейса — обновление решения или обращение к его разработчику.
Чем это отличается от фатальной ошибки
Уведомление об устаревании сайт не роняет: страница отрисуется. Но тот же null, переданный в типизированный параметр метода, даёт уже фатальную ошибку TypeError и белый экран — разбор этого случая в отдельной инструкции.
Что сделать на боевом сайте прямо сейчас
Проверьте, что вывод ошибок посетителям выключен, а запись в журнал — включена. Посетитель не должен видеть пути к файлам, но вам нужен список того, что чинить. Сам список удобнее собирать на копии сайта с включённым отладочным режимом.
Частые вопросы
Можно просто отключить показ этих сообщений?
Можно — и на боевом сайте вывод ошибок действительно должен быть выключен. Но отключение не решает проблему: в следующих версиях PHP те же вызовы станут фатальной ошибкой, и сайт упадёт. Считайте уведомления списком дел, а не шумом.
Почему сообщений тысячи?
Потому что проверка срабатывает на каждом вызове. Один проблемный вызов в шапке сайта даёт по сообщению на каждую страницу. Обычно за тысячами сообщений стоит десяток мест в коде.
Сообщения появились, а сайт работает. Это срочно?
Не срочно, но и не «потом»: если журнал ошибок пухнет, место на диске кончается быстрее, чем кажется, а за гигабайтами одинаковых строк теряются настоящие ошибки.