1С-Битрикс

Ошибка PHP 8: Argument #1 must be of type Countable|array, null given — решение для Битрикс

Исправление ошибки Argument #1 must be of type Countable|array, null given при переходе на PHP 8. Причины, примеры проблемного кода в Битрикс и 4 способа решения

sqlka.ruОпубликовано: Чтение: 3 мин.
Ошибка PHP 8: Argument #1 must be of type Countable|array, null given — решение для Битрикс

При переходе на PHP 8.0 и выше многие проекты на 1С-Битрикс сталкиваются с фатальной ошибкой:

Argument #1 ($value) must be of type Countable|array, null given (0)

Эта проблема связана с ужесточением требований к типу аргумента во встроенной функции count().

Причина ошибки

В PHP 7 вызов count() с аргументом null возвращал 0 и считался допустимым:

count(null); // возвращает 0 в PHP 7

В PHP 8 поведение изменилось. Теперь count() строго требует, чтобы первый аргумент был:

  • Массивом (array)
  • Или объектом, реализующим интерфейс Countable

Передача null, строки, числа или любого другого неподходящего типа вызывает фатальную ошибку.

Где возникает ошибка в Битрикс?

Проблема чаще всего встречается в:

  • Старых компонентах и их шаблонах
  • Кастомных модулях
  • Файлах включений (include)
  • Работе с результатами функций, которые могут вернуть null

Пример проблемного кода:

// Если $items может быть null - в PHP 8 будет ошибка
if (count($items) > 0) {
    // логика обработки
}

Типичные переменные, которые могут содержать null: $arResult, $arParams, $items, $list и другие.

Способы исправления

Вариант 1: Проверка на массив перед count() (рекомендуется)

Наиболее безопасный и читаемый способ:

if (is_array($items) && count($items) > 0) {
    // логика обработки
}

Вариант 2: Приведение к массиву

Короткое и универсальное решение:

if (count((array)$items) > 0) {
    // логика обработки
}

Приведение (array)$items преобразует null в пустой массив [].

Вариант 3: Оператор объединения с null (Null Coalescing)

if (count($items ?? []) > 0) {
    // логика обработки
}

Если $items равен null, будет использован пустой массив [].

Вариант 4: Использование empty() для проверки (специфично для Битрикс)

if (!empty($arResult['ITEMS'])) {
    // логика обработки
}

Функция empty() безопасно работает с null и другими типами данных.

Как найти проблемные места в коде

  1. Выполните поиск по проекту: count(
  2. Особое внимание уделите:
    • Шаблонам компонентов (/local/templates/, /bitrix/templates/)
    • Кастомным компонентам (/local/components/)
    • Файлам включений и модулям
  3. Проверьте все вызовы count(), где аргумент может потенциально быть null

Итог

При переходе на PHP 8 важно обеспечить, чтобы в функцию count() всегда передавался массив или объект, реализующий Countable. Используйте предложенные методы исправления, чтобы сделать код совместимым с новой версией PHP.

Для комплексной проверки совместимости вашего проекта с PHP 8 можно использовать инструменты статического анализа кода или запустить сайт в режиме разработки с отображением всех предупреждений.

Хотите освоить SQL для работы с данными?

В SQLka можно изучать SQL последовательно или готовиться к собеседованиям. Запросы выполняются прямо в браузере — устанавливать базу данных не нужно.

sqlka.ru

support@sqlka.ru

Дальше по теме

1С-Битрикс

Логирование в 1С-Битрикс: полное руководство для разработчика

Полное руководство по логированию в 1С-Битрикс: какие логгеры есть, как их настроить, форматировать сообщения и подключать к своим классам. Примеры кода и советы по использованию PSR-3

sqlka.ruЧтение: 4 мин.
← Все статьи