Как исправить ошибку count() в Joomla 3.8 с PHP 7.3
При обновлении PHP до версии 7.3 на сайтах с Joomla 3.8 нередко возникает предупреждение: Warning: count(): Parameter must be an array or an object that implements Countable. Это связано с ужесточением правил работы функции count() в новых версиях PHP. Разберём причину и способы решения.
Почему возникает ошибка
В PHP 7.3 функция count() требует, чтобы переданный параметр был массивом или объектом, реализующим интерфейс Countable. Если передаётся false, null или другое неитерируемое значение, выбрасывается предупреждение. В компоненте com_weblinks Joomla 3.8 ошибка появляется в файле /components/com_weblinks/models/categories.php на строке 95: if (!count($this->_items)). Переменная $this->_items может принимать значение false (когда нет дочерних категорий), что и вызывает сбой.
Как исправить: проверка типа перед count()
Лучшее решение - заменить строку 95 на проверку, является ли $this->_items массивом, перед вызовом count(). Используйте конструкцию:
if (!is_array($this->_items) || !count($this->_items))Этот код сначала проверяет, что переменная - массив, и только затем считает элементы. Если $this->_items - false или null, условие сработает как истинное, и скрипт перейдёт к загрузке данных.
Альтернативные варианты
Можно использовать:
if (empty($this->_items))- функцияempty()не вызывает предупреждение для несуществующих или пустых значений.if (!count((array) $this->_items))- приведение к массиву, но это может скрыть логические ошибки.
Однако первый вариант с is_array() наиболее безопасен и соответствует стандартам Joomla.
Пошаговая инструкция
- Откройте файл
components/com_weblinks/models/categories.phpчерез FTP или файловый менеджер хостинга. - Найдите строку 95:
if (!count($this->_items)). - Замените её на:
if (!is_array($this->_items) || !count($this->_items)). - Сохраните изменения. Ошибка в логах исчезнет.
После исправления проверьте работу компонента Web Links - ссылки и категории должны выводиться корректно.
Почему не стоит использовать isset() и empty() без проверки
Некоторые предлагают код if (isset($this->_items) && !empty($this->_items)). Это тоже сработает, но isset() здесь избыточен, так как свойство $this->_items всегда определено в классе. empty() сам по себе надёжен, но если вы хотите явно указать, что ожидаете массив, используйте is_array().
Заключение
Ошибка count() в Joomla 3.8 на PHP 7.3 решается простой заменой строки в файле модели. Это не влияет на производительность и полностью устраняет предупреждение. Регулярно обновляйте расширения Joomla - в актуальных версиях компонента Web Links подобные ошибки уже исправлены.