PSR-4配置必须严格匹配命名空间与目录结构,命名空间末尾须双反斜杠转义(如"MyVendor\MyPackage\"),路径用正斜杠结尾(如"src/"),类名、文件名、目录层级及大小写须逐字符一致,修改后必须执行composer dump-autoload生效。

psr-4 配置必须严格匹配命名空间与目录结构
PSR-4 是最常用也最容易出错的自动加载方式。它不是“模糊匹配”,而是按前缀逐字符比对命名空间,再拼接路径。比如你在 composer.json 里写:
"autoload": {
"psr-4": {
"MyVendor\MyPackage\": "src/"
}
}
那 MyVendorMyPackageUtilsHelper 就必须对应 src/Utils/Helper.php,中间不能多一层 MyPackage 目录,也不能少反斜杠转义(\ 在 JSON 里是必需的)。
- 命名空间末尾的反斜杠
\不可省略,否则 Composer 会当作 PSR-0 处理 - 路径用正斜杠
/,Windows 下也不要用 - 如果类文件在
src/MyPackage/Utils/Helper.php,但命名空间是MyVendorMyPackageUtilsHelper,就会加载失败 —— 因为MyPackage被重复了
classmap 适合非标准结构或函数文件
当你有全局函数、Traits、或者类散落在多个不规则目录(比如 legacy/、helpers/),PSR-4 没法覆盖时,classmap 是更直接的选择。它不依赖命名空间,只扫描指定路径下所有 .php 文件并建立类名 → 文件路径映射。
配置示例:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
"autoload": {
"classmap": ["legacy/", "helpers/functions.php"]
}
- 路径可以是目录,也可以是具体文件(如
functions.php) - 执行
composer dump-autoload后,这些文件会在每次请求时被require_once—— 所以别放有副作用的代码 - 相比 PSR-4,
classmap在生产环境配合--optimize-autoloader更快,但开发阶段更新文件后需重新 dump
files 加载全局函数要小心作用域污染
如果你的包提供的是纯函数(比如 str_slug()、array_flatten()),且不想套命名空间,就用 files 字段。它会在每次自动加载初始化时无条件 include_once 指定文件。
"autoload": {
"files": ["src/helpers.php"]
}
- 文件路径是相对于
composer.json的,不是相对于当前工作目录 - 函数名冲突风险高:如果两个包都定义了
str_slug(),后加载的会覆盖前者,且 PHP 不报错 - 无法按需加载,只要引入了 autoload,这些函数就永远在内存里 —— 对 CLI 工具类包影响不大,但对 Web 项目要谨慎
autoload-dev 和测试类路径别混进主 autoload
测试类(如 tests/ 下的 MyPackageTest)不该出现在生产自动加载表里,否则会增大 classmap、拖慢首次请求。正确做法是用 autoload-dev 单独声明:
"autoload": {
"psr-4": { "MyVendor\MyPackage\": "src/" }
},
"autoload-dev": {
"psr-4": { "MyVendor\MyPackage\Tests\": "tests/" }
}
-
autoload-dev只在本地开发或运行composer install --dev时生效,CI 构建用--no-dev就不会包含 - 不要把
tests/写进主autoload,否则composer dump-autoload -o会把它扫进去,白占内存 - 某些 IDE 或静态分析工具依赖
autoload-dev来识别测试类,漏配会导致跳转/补全失效
真正容易被忽略的点是:autoload 配置改完后,composer dump-autoload 必须执行,而且得确认生成的 vendor/composer/autoload_psr4.php 里真有你的映射 —— 有时候 JSON 语法错误或路径不存在,Composer 会静默跳过,不报错也不提示。

















