Бесплатный экспресс-аудит сайта Безопасность, SEO, AI-поиск и 152-ФЗ — отчёт с баллами за минуту Проверить сайт
Обсудить проект

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

Дальше идёт трассировка — список вызовов, который привёл к ошибке. Читать её нужно снизу вверх: внизу точка входа, вверху место падения.

Как разобрать

  1. Найдите в трассировке первый файл, который принадлежит вам: шаблон компонента, свой компонент, файл в /local/. Это и есть место, где появилось пустое значение.
  2. Посмотрите, откуда берётся переменная: свойство инфоблока, параметр компонента, поле пользователя, результат выборки.
  3. Проверьте, почему оно может быть пустым: свойство не заполнено у части элементов, параметр не передали, выборка ничего не вернула.

Как починить

Привести значение к строке перед передачей: (string)$value или $value ?? ''. Если пустое значение означает ошибку в данных, лучше проверить его явно и не выводить блок целиком, чем молча подставлять пустую строку — иначе на сайте появятся пустые карточки, и никто об этом не узнает.

Как найти такие места заранее

До переключения боевого сайта пройдите по копии с включённой отладкой: главная, список и детальная карточка каталога, корзина, оформление заказа, поиск, личный кабинет, формы. Отдельно проверьте элементы с незаполненными свойствами — именно они дают ошибки, которые не видны на главных страницах.

Полный порядок перехода на PHP 8 с проверкой модулей — в отдельной инструкции.

Частые вопросы

Чем это отличается от сообщения Deprecated про null?

Deprecated — предупреждение, страница продолжает работать. TypeError останавливает выполнение: пользователь видит белый экран или страницу ошибки. Причина у них общая — пустое значение там, где ждут строку.

Ошибка в модуле вендора. Править файл?

Нет. Файлы в /bitrix/modules/ перезаписываются при обновлении. Если ошибка там, обновите продукт: такие несовместимости вендор чинит. Ваша задача — найти, какое пустое значение туда приходит из ваших данных или шаблона.

Ошибка появляется только на одной странице. Почему?

Потому что именно у этого элемента не заполнено свойство, из которого берётся значение. Такие ошибки выглядят случайными, пока не найдёшь закономерность: пустое поле, удалённый раздел, товар без картинки.