При переходе на 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 и другими типами данных.
Как найти проблемные места в коде
- Выполните поиск по проекту:
count(
- Особое внимание уделите:
- Шаблонам компонентов (
/local/templates/, /bitrix/templates/)
- Кастомным компонентам (
/local/components/)
- Файлам включений и модулям
- Проверьте все вызовы
count(), где аргумент может потенциально быть null
Итог
При переходе на PHP 8 важно обеспечить, чтобы в функцию count() всегда передавался массив или объект, реализующий Countable. Используйте предложенные методы исправления, чтобы сделать код совместимым с новой версией PHP.
Для комплексной проверки совместимости вашего проекта с PHP 8 можно использовать инструменты статического анализа кода или запустить сайт в режиме разработки с отображением всех предупреждений.
При переходе на PHP 8.0 и выше многие проекты на 1С-Битрикс сталкиваются с фатальной ошибкой:
Эта проблема связана с ужесточением требований к типу аргумента во встроенной функции
count().Причина ошибки
В PHP 7 вызов
count()с аргументомnullвозвращал 0 и считался допустимым:В PHP 8 поведение изменилось. Теперь
count()строго требует, чтобы первый аргумент был:array)CountableПередача
null, строки, числа или любого другого неподходящего типа вызывает фатальную ошибку.Где возникает ошибка в Битрикс?
Проблема чаще всего встречается в:
include)nullПример проблемного кода:
Типичные переменные, которые могут содержать
null:$arResult,$arParams,$items,$listи другие.Способы исправления
Вариант 1: Проверка на массив перед count() (рекомендуется)
Наиболее безопасный и читаемый способ:
Вариант 2: Приведение к массиву
Короткое и универсальное решение:
Приведение
(array)$itemsпреобразуетnullв пустой массив[].Вариант 3: Оператор объединения с null (Null Coalescing)
Если
$itemsравенnull, будет использован пустой массив[].Вариант 4: Использование empty() для проверки (специфично для Битрикс)
Функция
empty()безопасно работает сnullи другими типами данных.Как найти проблемные места в коде
count(/local/templates/,/bitrix/templates/)/local/components/)count(), где аргумент может потенциально бытьnullИтог
При переходе на PHP 8 важно обеспечить, чтобы в функцию
count()всегда передавался массив или объект, реализующийCountable. Используйте предложенные методы исправления, чтобы сделать код совместимым с новой версией PHP.Для комплексной проверки совместимости вашего проекта с PHP 8 можно использовать инструменты статического анализа кода или запустить сайт в режиме разработки с отображением всех предупреждений.