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