← 中文资源

简体中文版本

PHP 致命错误 — 未定义函数与类找不到

通过 php -l、完整错误输出、扩展列表与 Composer 自动加载,定位 PHP 致命错误,修复缺失扩展、命名空间与 class map 问题。

阅读英文原文

现象

报 PHP Fatal error: Uncaught Error: Call to undefined function curl_init(),或 Class "App\Services\Mailer" not found;浏览器只返回 500 没有细节;同一份代码在一台服务器正常、另一台失败。

诊断

先做语法检查并打开完整错误输出:

php -l app/Services/Mailer.php
php -d display_errors=1 -d error_reporting=E_ALL -d log_errors=0 app/index.php
php -m | grep -i curl
php -r "var_dump(class_exists('App\\Services\\Mailer'));"

php -l 能直接指出语法错误行;第二条会打印未捕获错误的文件与行号,而不是空白 500。php -m 列出当前 SAPI 加载的扩展,CLI 与 FPM 可能读取不同的 php.ini。class_exists 返回 false 说明自动加载无法把命名空间映射到文件。

再确认错误日志位置与权限:

php -i | grep -E 'error_log|display_errors|log_errors'
tail -n 50 /var/log/php/error.log

修复

缺少函数时安装并启用对应扩展,例如 sudo apt-get install php8.3-curl 后重载 FPM。类找不到时按 PSR-4 对齐命名空间与路径,并重新生成自动加载:

composer dump-autoload -o

文件应位于 app/Services/Mailer.php 且声明 namespace App\Services;,composer.json 中 App\\ 映射到 app/;Linux 区分大小写,不能依赖本地文件系统的大小写不敏感。类型错误应在边界处修正值,而不是盲目强制转换。

验证

重新请求失败路由,确认返回正常而不是 500;检查错误日志没有新的 fatal 记录,并在与生产扩展一致的容器中运行测试。生产环境保持 display_errors=Off、log_errors=On,否则下一次致命错误仍然只会留下一个无信息的 500。