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