Как исправить ошибку 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.

    Пошаговая инструкция

    1. Откройте файл components/com_weblinks/models/categories.php через FTP или файловый менеджер хостинга.
    2. Найдите строку 95: if (!count($this->_items)).
    3. Замените её на: if (!is_array($this->_items) || !count($this->_items)).
    4. Сохраните изменения. Ошибка в логах исчезнет.

    После исправления проверьте работу компонента 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 подобные ошибки уже исправлены.

    Часто задаваемые вопросы