psr-4自动加载生效需同时满足三条件:composer.json中autoload为顶层键且格式正确、命名空间前缀以双反斜杠结尾并路径严格对齐、执行过composer dump-autoload。

composer.json 里 psr-4 配置写错一个字符就失效
PSR-4 映射不是“写完就能用”,它依赖三处严格对齐:composer.json 中的键值格式、类文件物理路径、PHP 文件里的 namespace 声明。
常见静默失败原因:
-
"autoload"键被误写成"autoloader"或塞进"scripts"里 —— Composer 直接忽略整段 -
"App"写成"App"(少一个反斜杠)→ JSON 解析后变成无尾缀命名空间,匹配永远失败 -
"src"写成"src/"或"./src/"→ 路径解析异常,尤其在 Docker 多容器场景下极易出错 - 路径用了
../lib或绝对路径/var/www/src→ Composer 只接受相对于composer.json的子路径
vendor/autoload.php 引入了,但类还是找不到
vendor/autoload.php 只是注册加载器的入口,真正干活的是 vendor/composer/autoload_psr4.php —— 这个文件不会自动更新,改完 composer.json 后必须手动运行命令重建。
调试建议:
- 执行
composer dump-autoload(开发阶段别加-o,否则跳过路径校验,掩盖真实问题) - 直接
var_dump(include 'vendor/composer/autoload_psr4.php');看数组里有没有你配的"App\"键 - 检查
src/目录是否真实存在(注意大小写:Linux/macOS 下Src/≠src/) - 确认
public/index.php顶部是require __DIR__.'/../vendor/autoload.php';,而不是硬编码require 'src/Controller/UserController.php';
类文件路径和 namespace 必须逐字符对齐
PSR-4 不扫描目录,只做字符串替换:剥离命名空间前缀后,把剩余部分的 全替换成 /,再拼上配置路径。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
例如配置 "App\": "src/",调用 new AppHttpControllersHomeController();:
- 剥离
App→ 得到HttpControllersHomeController - 转
为/→Http/Controllers/HomeController - 拼路径 →
src/Http/Controllers/HomeController.php
所以这三者必须完全一致:
-
namespace AppHttpControllers;(注意Http大写,不能是http) - 文件路径必须是
src/Http/Controllers/HomeController.php(不能少Http层或写成http) - 类名必须是
class HomeController→ 文件名必须叫HomeController.php(大小写敏感,不接受homecontroller.php)
为什么不用 classmap 或 PSR-0
PSR-4 是 Composer 默认且唯一持续维护的按需加载方案;classmap 虽快但需全量扫描,每次增删类都得重跑 dump-autoload -o;PSR-0 已废弃,兼容旧项目但语义模糊、性能差、易冲突。
真正容易被忽略的一点是:PSR-4 的映射关系一旦写进 autoload_psr4.php,就完全脱离文件系统实时状态——哪怕你删了整个 src/ 目录,只要缓存没清,new AppFoo() 仍会尝试去加载一个根本不存在的路径,报错却是 Class not found,而非 Directory does not exist。所以每次怀疑自动加载失效,第一反应不该是查代码,而是看 autoload_psr4.php 里有没有那条映射。










