PHP LinuxWindowsmacOS

PHP 8.5: старый код вызывает TypeError из-за передачи null в строковый аргумент

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

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

Как отличить TypeError при передаче null в строковый аргумент от предупреждения Deprecated в PHP 8.5, найти источник null и выбрать исправление без скрытия ошибок.

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

#Когда возникает ошибка

После переноса старого проекта на PHP 8.5 вызов строковой функции иногда завершается TypeError, а иногда сообщает о нежелательном использовании null через Deprecated. Это разные ситуации. В частности, в режиме strict_types=1 встроенные функции требуют строгого соответствия типов; при обычном режиме для ряда встроенных функций передача null пока может преобразовываться с предупреждением. Пользовательская функция со строковым типом также не принимает null, если параметр не объявлен nullable.

#Причины и признаки

Возможная причинаКак узнатьЧто делать
Пользовательская функция со stringКод вызывает функцию с параметром string $name, передавая значение null.В стеке исключения видна сигнатура вашей функции и null given.Установите причину отсутствия значения; сделайте параметр ?string только если отсутствие допустимо.
Строгий режим и встроенная функцияВ файле вызова действует declare(strict_types=1), либо функция вовсе не принимает данный тип.Сообщение указывает trim(), strlen() или другую встроенную функцию, а вызов передаёт null.Проверьте источник данных и передайте строку после осознанной проверки.
Предупреждение об устаревшем вызовеВ нестрогом режиме встроенная функция пока принимает null с уведомлением Deprecated для ненулевого строкового параметра.В журнале Deprecated: Passing null to parameter ... вместо TypeError.Исправьте передачу null; не ограничивайтесь отключением E_DEPRECATED.

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

  1. Запишите точное сообщение и место вызоваВ тестовой копии проекта включите запись ошибок PHP в закрытый журнал, а не показ посетителям. В панели сайта или терминале найдите строку с TypeError либо Deprecated, имя функции, файл и номер строки. Если в сообщении упомянут другой тип (например, array), не применяйте лечение для null. При отсутствии доступа к журналу обратитесь к администратору размещения.
  2. Сверьте версию того PHP, который выполняет сайтВ терминале проекта выполните php -v — это версия командной строки, не обязательно сайта. В настройках PHP-FPM или панели управления посмотрите назначенный версии обработчик сайта и его журнал. Если CLI и сайт различаются, тестируйте копию именно на версии сайта; не переключайте работающий сайт только ради диагностики.
  3. Найдите источник null на указанной строкеОткройте файл и строку в редакторе, например Visual Studio Code: «Файл» → «Открыть папку», затем Ctrl+G и номер строки. Проследите переменную к данным запроса, полю базы, настройке либо возвращаемому значению функции. Для временной диагностики записывайте в закрытый журнал только тип переменной (get_debug_type), не сами персональные данные или пароли.
  4. Определите, допустимо ли отсутствие значенияЕсли поле обязательно (например, имя файла или токен), проверяйте его до вызова и возвращайте понятную ошибку ввода. Если пустая строка — корректное значение по смыслу операции, используйте ?? '' только для nullable-источника. Для null, означающего «не указан», нельзя автоматически заменять его строкой: можно незаметно изменить правила поиска или авторизацию.
  5. Исправьте пользовательскую сигнатуру только по контрактуКогда параметр вправе отсутствовать, поменяйте объявление string $value на ?string $value и добавьте отдельную ветку для null в теле функции. Когда параметр обязателен, оставьте string и исправьте вызывающий код. Не делайте все параметры nullable массовым поиском и заменой: это замаскирует ошибки данных.
  6. Проверьте синтаксис и основной сценарий на копииСохраните исходный файл для отката, запустите php -l путь/к/файлу.php в терминале и убедитесь в No syntax errors detected. Затем воспроизведите и заполненное значение, и отсутствие значения через тестовую страницу или тесты проекта. Если форма всё ещё падает, откатите файл из копии и проверьте, не передаётся ли null в следующую функцию цепочки.
  7. Разделите локальные ошибки и поведение сайтаПроверьте журнал сайта ещё раз при том же действии. Если CLI-код исправлен, но веб-страница ошибается, посмотрите журнал PHP-FPM, кеш предварительной компиляции и фактический путь загруженного файла; не очищайте кеш всего сервера без необходимости. Задокументируйте вариант данных, который вызывал null, и добавьте его в автоматические тесты.

#Проверяемый пример и команды

PHP
Сохраните как отдельный php85-null-check.php и выполните в терминале php php85-null-check.php на PHP 8.x; ожидается [] и [Анна] (с переводом строк). Код демонстрационный: если пустое имя недопустимо, замените ?? на явную проверку с ошибкой, а не копируйте пример в авторизацию.
<?php
declare(strict_types=1);

function normalizedName(?string $name): string
{
    // В этом примере отсутствие имени равнозначно пустой строке.
    return trim($name ?? '');
}

echo '[' . normalizedName(null) . ']' . PHP_EOL;
echo '[' . normalizedName('  Анна  ') . ']' . PHP_EOL;
Linux · Терминал (Bash)Команда
В терминале рабочей копии. Первая команда показывает версию CLI, вторая проверяет синтаксис файла. Права администратора не нужны.
php -v
php -l php85-null-check.php

#Проверка исправления и действия при неудаче

Ошибка считается устранённой, когда отсутствующий параметр обрабатывается согласно правилам приложения, а вызов с заполненным значением продолжает работать. TypeError и Deprecated по этой строке больше не появляются в закрытом журнале. Если проблема осталась, сохраните стек без персональных данных и сверяйте типы входов по цепочке вызовов.

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

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