改完 composer.json 的 autoload 字段后必须运行 composer dump-autoload,否则自动加载不生效;psr-4 路径与命名空间、目录结构须严格一致,大小写敏感,classmap 适合老代码但需手动重 dump,files 仅用于函数/常量。

改完 composer.json 的 autoload 字段后,不运行 composer dump-autoload,自动加载永远不会生效——这是 90% “Class not found” 报错的真正原因。
psr-4 映射写错一个字符就完全失效
PSR-4 不是模糊匹配,它对格式极其敏感:
-
"App\": "src/"是合法的;"App": "src/"(缺反斜杠)或"App\": "src"(路径末尾缺斜杠)都会静默失败 - 命名空间声明必须严格对应目录结构:类
App\Http\Controller\Home必须在src/Http/Controller/Home.php,不能是src/app/Http/...或src/http/... - Linux/macOS 下大小写敏感:
src/Services/≠src/services/,文件名User.php里定义class user也找不到 - 路径是相对于
composer.json所在目录的,不是项目根目录、也不是vendor/目录
classmap 适合老代码,但新增类必须重 dump
当你有一批无命名空间、类名与文件名不一致、或散落在多个非标准目录的老代码时,classmap 是最务实的选择:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 配置示例:
"classmap": ["legacy/", "lib/Database.class.php"],Composer 会扫描并提取所有class和interface声明 - 它不校验命名空间或文件名规则,只认物理路径下的
.php文件 - 新增一个
legacy/Helper.php后,必须手动执行composer dump-autoload,否则这个类永远“看不见” - 避免写
"classmap": ["."]—— 会把vendor/、tests/全扫进去,映射表膨胀、加载变慢,甚至引发同名类冲突
files 只能放函数/常量,千万别塞类
files 不是类加载器,而是每次请求时无条件 require_once 的静态包含机制:
- 适用场景:全局辅助函数、
define()常量、环境初始化逻辑,如"src/functions.php"、"config/constants.php" - 绝对不要把
UserService.php这类含class定义的文件放进files数组,否则直接报Fatal error: Cannot declare class UserService - 路径必须是相对于
composer.json的完整路径,"functions.php"(缺目录)会报错 - 多个
files的加载顺序由 Composer 内部决定,不可控;有依赖关系时建议改用classmap或封装成类
autoload-dev 是测试类的专属通道
测试类(如 Tests\Unit\UserTest)不该混进主自动加载逻辑:
- 正确做法是在
composer.json中单独配置:"autoload-dev": { "psr-4": { "Tests\": "tests/" } } - 这样
composer install --no-dev时,Tests\命名空间根本不会写入生产环境的vendor/autoload.php - 如果图省事把
"tests/"加进主autoload,CI 流水线或线上日志里可能意外触发测试类初始化,带来安全隐患 - PHPUnit 默认读取
autoload-dev,所以测试类路径配错也会直接报Class not found
最常被跳过的动作是:改完 composer.json 后忘记 composer dump-autoload;最常被忽略的细节是:psr-4 路径和实际目录结构是否真的大小写一致、层级对齐——这两点不确认清楚,其他配置再漂亮也没用。










