PHP PHP 8LinuxWindows

PHP 8: После перехода на PHP 8 старый код выдаёт TypeError

  • Обновлено
  • Чтение ≈ 4 минуты

Краткий ответ

После перехода на PHP 8 вызов функции, оператор или обращение к библиотеке может завершиться TypeError: фактический тип значения несовместим с требуемым. Ошибка указывает файл и строку; исправлять следует источник значения, а не скрывать исключение.

В этой статье
  1. Когда возникает проблема и как её отличить
  2. Возможные причины и диагностические признаки
  3. Пошаговая диагностика и исправление
  4. Как проверить, что проблема устранена
  5. Если ошибка осталась

#Когда возникает проблема и как её отличить

После перехода на PHP 8 вызов функции, оператор или обращение к библиотеке может завершиться TypeError: фактический тип значения несовместим с требуемым. Ошибка указывает файл и строку; исправлять следует источник значения, а не скрывать исключение.

#Возможные причины и диагностические признаки

Возможная причинаКак узнатьЧто делать
Некорректный аргумент встроенной функцииВ PHP 8 ряд операций стал строже проверять тип аргумента, особенно null, массивы и строки.В стеке упомянуты count(), strlen(), array_key_exists() или другая встроенная функцияПеред вызовом проверить тип и преобразовать данные по смыслу.
Неожиданный тип ответа API или базыВместо массива получены null, false или строка ошибки.Проблема возникает только на конкретной записи, ответе или после обновления поставщикаПроверить возврат и ветку ошибки до передачи в функцию.
Несовместимая сигнатура собственного кодаОбъявленная типизация и фактически переданное значение расходятся.Сообщение ссылается на объявление параметра или returnСогласовать контракт вызывающей и вызываемой функций.

#Пошаговая диагностика и исправление

  1. Сохраните точное исключение и подготовьте безопасную проверкуОткройте журнал ошибок PHP в панели хостинга или журнал PHP-FPM, найдите запись Uncaught TypeError и выпишите имя функции, путь и номер строки. Не выкладывайте полный журнал публично: в нём могут быть пароли и параметры запросов. Сначала сделайте копию нужного PHP-файла и воспроизведите действие на тестовом сайте с теми же входными данными.
  2. Уточните, какая версия PHP действительно выполняет запросНа тестовом сервере в консоли каталога проекта выполните php -v: первая строка содержит версию CLI. Важно: веб-сайт может использовать другой PHP-FPM; сравните версию с настройками сайта в панели хостинга. Изменения тестируйте на той же версии, на которой возникает ошибка. Если терминал не доступен, попросите администратора сообщить версию PHP-FPM сайта.
  3. Найдите виноватый аргумент, а не последнюю строку шаблонаОткройте файл и строку из сообщения в редакторе с показом номеров строк. Например, сообщение count(): Argument #1 ($value) must be of type Countable|array, null given означает, что в count(...) пришло null. Проследите источник переменной на несколько строк вверх: параметр запроса, результат функции или чтение базы. Не изменяйте все вызовы count() подряд.
  4. Проверьте фактический тип без утечки данныхВо временном тестовом сценарии перед проблемным вызовом добавьте error_log(get_debug_type($value));, подставив имя переменной. Повторите запрос, затем откройте журнал: увидите null, string, array и т. п., но не само секретное значение. Удалите диагностическую строку после проверки. Если имя переменной неизвестно, уточните его по аргументу и стеку ошибки.
  5. Исправьте проверку по смыслу данныхЕсли функция получает перечень записей, обеспечьте массив на уровне источника и отдельно обработайте отсутствие ответа. Для count($items) допустима проверка if (!is_array($items) && !($items instanceof Countable)) { /* обработка ошибки */ }, после чего выполняйте count($items). Не заменяйте ошибку слепым приведением (array)$value: оно может превратить неверный ответ в бессмысленный результат.
  6. Проверьте строгие объявления типов в собственных функцияхПосмотрите объявление функции: function total(array $rows): int действительно принимает только массив. Если возможен null, решите, является ли он ошибкой или разрешённым состоянием; во втором случае можно изменить контракт на ?array и явно обработать null внутри. Не удаляйте declare(strict_types=1) ради подавления TypeError: проблема останется скрытой.
  7. Перепроверьте разные входные данные и верните исправлениеЗапустите сценарий с обычной записью, пустым ответом и ошибочным ответом на копии сайта. Убедитесь, что журнал не содержит нового TypeError и пользователь получает корректный результат либо ясное сообщение. Только после резервной копии перенесите минимальное исправление на сайт; при новой ошибке верните исходный файл и сравните стек.
  8. Дополнительная команда по теме
    Linux · Терминал (Bash)Команда
    Командная строка в каталоге проекта, обычный пользователь; показывает только CLI-версию PHP. Версию PHP-FPM уточняйте отдельно.
    php -v

#Как проверить, что проблема устранена

Пройдите страницу или запрос, который вызывал TypeError, и повторите его с пустыми и неверными данными. В журнале PHP не должно появиться нового TypeError; отрицательные ответы должны обрабатываться явно. Если ошибка сместилась, начните с нового стека и не игнорируйте его.

#Если ошибка осталась

Повторите исходный сценарий в тестовой среде, откройте свежую запись журнала с точным временем, именем функции, файлом и строкой. Сравните новое сообщение с исходным: ошибка могла переместиться на следующий участок кода. Не подавляйте все ошибки общим обработчиком. Если изменения затрагивали работающий проект, восстановите сохранённую копию и разберите новое сообщение до повторного переноса.

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.