TypeError: must be of type string, null given — фатальная ошибка на PHP 8
Текст ошибки:
Fatal error: Uncaught TypeError: htmlspecialchars(): Argument #1 ($string) must be of type string, null given
Дальше идёт трассировка — список вызовов, который привёл к ошибке. Читать её нужно снизу вверх: внизу точка входа, вверху место падения.
Как разобрать
- Найдите в трассировке первый файл, который принадлежит вам: шаблон компонента, свой компонент, файл в
/local/. Это и есть место, где появилось пустое значение. - Посмотрите, откуда берётся переменная: свойство инфоблока, параметр компонента, поле пользователя, результат выборки.
- Проверьте, почему оно может быть пустым: свойство не заполнено у части элементов, параметр не передали, выборка ничего не вернула.
Как починить
Привести значение к строке перед передачей: (string)$value или $value ?? ''. Если пустое значение означает ошибку в данных, лучше проверить его явно и не выводить блок целиком, чем молча подставлять пустую строку — иначе на сайте появятся пустые карточки, и никто об этом не узнает.
Как найти такие места заранее
До переключения боевого сайта пройдите по копии с включённой отладкой: главная, список и детальная карточка каталога, корзина, оформление заказа, поиск, личный кабинет, формы. Отдельно проверьте элементы с незаполненными свойствами — именно они дают ошибки, которые не видны на главных страницах.
Полный порядок перехода на PHP 8 с проверкой модулей — в отдельной инструкции.
Частые вопросы
Чем это отличается от сообщения Deprecated про null?
Deprecated — предупреждение, страница продолжает работать. TypeError останавливает выполнение: пользователь видит белый экран или страницу ошибки. Причина у них общая — пустое значение там, где ждут строку.
Ошибка в модуле вендора. Править файл?
Нет. Файлы в /bitrix/modules/ перезаписываются при обновлении. Если ошибка там, обновите продукт: такие несовместимости вендор чинит. Ваша задача — найти, какое пустое значение туда приходит из ваших данных или шаблона.
Ошибка появляется только на одной странице. Почему?
Потому что именно у этого элемента не заполнено свойство, из которого берётся значение. Такие ошибки выглядят случайными, пока не найдёшь закономерность: пустое поле, удалённый раздел, товар без картинки.