“Class not found”本质是PHP未加载类,主因是路径、命名空间与PSR-4自动加载规则不匹配:需严格核对文件路径大小写、namespace声明(如AppControllers)、类名(UserController)、composer.json中"App\": "app/"映射及dump-autoload生效。

“Class not found”不是类丢了,是 PHP 根本没去加载它——绝大多数情况,问题出在路径、命名空间、自动加载三者之间没对齐。
检查 namespace 声明与文件物理路径是否严格匹配
PSR-4 自动加载靠的是“命名空间转路径”的硬规则,差一个斜杠、多一个 Controller 后缀、大小写不一致,在 Linux 或容器里直接失败。
- 报错提示
AppControllersUserControllernot found → 先确认文件是否真在app/Controllers/UserController.php(注意大小写,controllers≠Controllers) - 打开该文件,第一行必须是
namespace AppControllers;(末尾分号不能少,不能写成AppControllersController或漏掉App) - 类定义必须是
class UserController,不能是class usercontroller或class UserController1 - Windows 下能跑 ≠ 部署成功:别信本地,用
ls -l app/Controllers/在目标环境上实查
验证 composer.json 的 PSR-4 配置与 dump-autoload 是否生效
Composer 不会自动感知你改了命名空间或挪了文件,它只认 vendor/composer/autoload_psr4.php 里登记的内容。
- 检查
composer.json中"psr-4"段是否包含:"App\": "app/"(注意双反斜杠和结尾斜杠) - 执行
composer dump-autoload -o,然后立刻检查vendor/composer/autoload_psr4.php里有没有这行映射 - 如果用了子目录如
app/v1/Controllers,但命名空间还是AppControllers,那得额外加一条映射,否则不会被收录 - 修改后仍报错?临时加一行
var_dump(class_exists('App\Controllers\UserController'));看返回false还是true
警惕 glob() 和 include 路径依赖 getcwd() 的陷阱
手写自动加载器时,glob("Classes/*Utility.php") 看似简洁,实则危险——它的路径基准是当前工作目录,不是文件所在目录。
立即学习“PHP免费学习笔记(深入)”;
- 当
Verification.phpinclude了autoload.php,而autoload.php里用了相对路径的glob(),结果就是空数组,类根本没加载 - 正确写法必须用
__DIR__锚定位置:$pattern = __DIR__ . '/../Classes/*Utility.php'; -
include或require语句必须放在namespace声明之前,否则语法错误直接中断 - 调试时可加
echo $pattern; print_r(glob($pattern));确认模式是否真能命中文件
用 __NAMESPACE__ 快速确认当前上下文,但别指望它解决加载问题
__NAMESPACE__ 是个“照妖镜”,不是“加载器”。它只告诉你 PHP 此刻认为自己在哪,不参与任何文件查找逻辑。
- 在报错文件开头加
echo __NAMESPACE__; die;,输出为空字符串说明你其实在全局空间,use或new时却写了带命名空间的类名,肯定挂 - 输出
AppControllers却报AppModelsUser找不到?问题不在当前文件,而在use AppModelsUser;那行或它的自动加载配置 - 别用
__NAMESPACE__ . 'User'拼路径去require——这绕过了 PSR-4,且容易因斜杠方向、编码 BOM 等引入新坑 - 真正要查加载路径,看
vendor/composer/autoload_psr4.php生成的映射,或用composer show --path
最易被忽略的一点:PHP 文件本身可能有 BOM 头、空白符或 HTML 内容混在 namespace 前,导致命名空间声明失效——这种错误不会报语法错,但会让整个文件的命名空间变成全局。用 hexdump -C yourfile.php | head 查 BOM,用 php -l 验证语法合法性。



















