#Когда возникает проблема и как её отличить
Ошибка Call to undefined function после смены версии PHP означает, что интерпретатор не знает указанную функцию: она могла быть удалена из языка, принадлежать отсутствующему расширению или не подключаться вместе с файлом.
#Возможные причины и диагностические признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Удалённая функция старого PHPСтарые функции были исключены из поддерживаемого PHP; включением расширения их не вернуть. | В ошибке указаны mysql_query, create_function или each | Переписать код на поддерживаемый аналог, проверить данные и запросы. |
| Не загружено расширениеАктивный веб-PHP не имеет нужного модуля. | Не найдены mb_strlen, imagecreatefromjpeg, mysqli_connect | Проверить extension_loaded в PHP-FPM и включить модуль. |
| Не подключён пользовательский файлФайл с объявлением не был подключён из-за пути или автозагрузки. | Ошибка ссылается на пользовательскую функцию, известную в проекте | Проверить require_once, include_path и точку входа. |
#Пошаговая диагностика и исправление
- Выпишите имя функции без догадокВ журнале PHP найдите полное сообщение
Uncaught Error: Call to undefined function function_name()с файлом и строкой. Откройте указанный исходник. Убедитесь, что это функция, а не статический метод класса. Запишите фактическую версию веб-PHP в панели сайта. - Определите источник функцииПоищите точное имя функции в официальном руководстве PHP и в исходниках своего проекта. Если это пользовательская функция, в редакторе ищите
function function_name(и посмотрите, в каком файле она определена. Если она принадлежит расширению, установите имя модуля. Если документация говорит Removed/удалена, ищите замену, а не настройку PHP. - Для
create_functionзамените старый вызов замыканиемЕсли ошибка именноcreate_function, откройте пример: старый вызов создавал функцию из текстовых строк и был удалён в PHP 8. Перепишите конкретный случай как анонимную функцию сfunction (...) use (...) { ... }или стрелочнуюfn(...) => .... Не подставляйте произвольный код вeval: это небезопасная замена. - Для старого
mysql_*мигрируйте работу с базойЕсли отсутствуетmysql_queryилиmysql_connect, это старый API, удалённый ещё в PHP 7. Планируйте переход на PDO или mysqli с подготовленными запросами и тестом на копии базы. Простое переименованиеmysql_queryвmysqli_queryбез проверки соединения, кодировки и параметров не гарантирует корректность. - Если нужна функция расширения, проверьте веб-PHPВ SSH выполните
php -mтолько для ориентира; затем через закрытую диагностику или настройки PHP-FPM подтвердите наличие модуля для самого сайта. Например,function_exists("mb_strlen")должен вернуть true при работающем mbstring. Если false, подключите модуль именно для выбранной версии PHP через панель/администратора. - Если функция написана вами, исправьте подключение файлаВходная точка должна подключать файл по устойчивому пути, например
require_once __DIR__ . "/lib/helpers.php";, если это соответствует структуре проекта. Проверьте существование файла, его регистр на Linux и отсутствие раннего выхода до подключения. Включение файла по относительному пути от текущей рабочей директории может ломаться при запуске из cron. - Пройдите исходный пользовательский сценарийНа тестовой копии выполните операцию, которая раньше падала, и проверьте ожидаемый результат: запрос к базе, обработку текста или генерацию изображения. Просмотрите новый журнал, потому что после устранения undefined function могут проявиться ошибки аргументов. Если тест не проходит, верните файл из резервной копии и разберите следующее сообщение.
- Командная строка, обычный пользовательLinux · Терминал (Bash)КомандаКомандная строка, обычный пользователь. Список модулей относится к CLI; для веб-сайта проверьте PHP-FPM отдельно.
php -vphp -m
#Как проверить, что проблема устранена
Ошибка Call to undefined function для нужного вызова должна исчезнуть. Функциональный результат нужно проверить отдельно: наличие функции ещё не означает, что приложение работает правильно.
#Если ошибка осталась
Повторите исходный сценарий в тестовой среде, откройте свежую запись журнала с точным временем, именем функции, файлом и строкой. Сравните новое сообщение с исходным: ошибка могла переместиться на следующий участок кода. Не подавляйте все ошибки общим обработчиком. Если изменения затрагивали работающий проект, восстановите сохранённую копию и разберите новое сообщение до повторного переноса.