psr-4配置必须写在composer.json顶层autoload字段中,格式为"app\": "src/",路径需含尾部/,目录与命名空间大小写严格匹配,文件名须首字母大写;混合旧代码应分用classmap或files,禁用-o开发调试,多映射按前缀长度降序匹配。

PSR-4 配置写错位置或格式,类根本不会被扫描
Composer 只认 composer.json 顶层的 autoload 字段,嵌在 require、scripts 里,或者拼成 autoloader,它直接无视。常见错误包括:
-
"App": "src/"缺少第二个反斜杠 → 应为"App\": "src/" - 路径写成
"src"(无尾部/)→ 拼接时变成srcMyClass.php,报错Class not found - 命名空间声明是
namespace AppHttpControllers;,但目录是src/http/controllers/→ Linux 下大小写不匹配,文件找不到 - 类文件名是
usercontroller.php,但类名是UserController→ PSR-4 要求首字母大写的文件名
验证方法:运行 composer dump-autoload 后,直接 var_dump(include 'vendor/composer/autoload_psr4.php');,看数组里有没有你配的键值对。
混合老代码(无命名空间)和新代码(PSR-4),别硬塞进同一套规则
把 legacy/ 或 database/seeds/ 这类没命名空间的目录强行塞进 psr-4,只会报错或漏加载。正确做法是分而治之:
- 有命名空间的新模块 → 全部走
psr-4,例如"App\": "src/" - 无命名空间的老类 → 单独用
classmap扫描,例如"classmap": ["legacy/", "scripts/"] - 全局函数文件(如
helpers.php)→ 放files,不是classmap,也不是psr-4
classmap 会递归读取每个 .php 文件并提取 class/interface/trait 声明,不关心命名空间是否存在,适合兜底。但别把 tests/ 或 examples/ 加进去,它们会被无差别扫入,徒增映射表体积。
开发期别急着加 -o,否则路径错误会被掩盖
composer dump-autoload -o(或 --optimize)会生成 autoload_classmap.php,跳过运行时路径拼接逻辑,直接查哈希表。这在生产环境能提速,但在开发阶段反而有害:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 如果 PSR-4 路径配错了,
-o后可能“看起来能跑”,实际只是 classmap 碰巧扫到了那个文件,换台机器或删掉缓存就崩 - classmap 不识别新增类,除非你再跑一次
dump-autoload -a(-a强制重扫所有 PHP 文件) - 日常改配置,先用
composer dump-autoload(不带参数),确保路径拼接逻辑走通;上线前再补-o
顺带一提:autoload-dev 和 autoload 是两套完全独立的配置,测试类必须放 autoload-dev 并单独执行 dump-autoload,否则 PHPUnit 找不到你的 TestCase。
vendor/autoload.php 不是配置入口,改了也没用
vendor/autoload.php 是生成文件,每次 composer install、update 或 dump-autoload 都会被覆盖。有人直接在里面加 require_once 或 patch 加载逻辑,结果下次命令一跑,全没了。
所有规则必须写死在项目根目录的 composer.json 的 autoload 字段里。改完立刻执行 composer dump-autoload —— Composer 不监听文件系统,也不会自动更新映射。
最容易被忽略的是:多个 PSR-4 映射共存时,Composer 按前缀长度**降序匹配**。比如同时配了 "App\": "src/" 和 "App\Http\": "http-src/",那么 AppHttpController 会命中后者;但如果顺序写反、或前缀重叠没理清,就会加载错目录。










