classmap 应显式指定路径如 "lib/" 而非 ["."],避免扫描冗余目录;files 仅用于函数/常量文件,不可加载类;psr-4 优先于 classmap;改配置后须在 composer.json 目录执行 composer dump-autoload。

classmap 怎么配才能扫到老代码
classmap 是加载非 PSR 规范类库最直接的方式,它不看命名空间、不依赖文件名,只扫描你指定路径下的 .php 文件,把里面用 class 声明的类名和文件路径记进 vendor/composer/autoload_classmap.php。
常见错误是写成 "classmap": ["."],结果把 vendor/、tests/ 全扫进去,映射表膨胀、加载变慢,甚至因同名类冲突导致加载错版本。
- 推荐显式列出目标路径,比如
"classmap": ["lib/", "legacy/", "src/utils.php"] - 目录会递归扫描,单个文件也能写(如
"legacy/Database.class.php") - 路径必须相对于
composer.json所在目录,不能写"./lib/"或"lib"(缺斜杠或点号都可能失效) - 如果真要扫整个项目但排除某些目录,得配合
exclude-from-classmap字段,例如:{ "autoload": { "classmap": ["."] }, "exclude-from-classmap": ["vendor/", "tests/", "node_modules/"] }
files 为什么不能用来加载类
files 的作用是每次请求时无条件 require_once 指定文件,适合全局函数、常量或初始化逻辑,但它不是“类加载器”——文件里定义类会导致重复定义错误,因为 files 不参与类查找流程,只做静态包含。
典型误用:把 helpers.php 改成 UserService.php 还塞进 files,结果一运行就报 Fatal error: Cannot declare class UserService。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 只放纯函数文件,如
"src/functions.php"、"config/constants.php" - 路径必须是相对于
composer.json的完整路径,不能写"functions.php" - 多个
files的加载顺序不可控,有依赖关系时建议改用classmap或封装成类
PSR-4 和 classmap 混用时谁先加载
Composer 加载类的顺序是固定的:先查 psr-4,再查 psr-0(已废弃),最后才 fallback 到 classmap 和 files。这意味着即使某个类同时出现在 psr-4 映射和 classmap 中,只要命名空间匹配成功,就永远走 psr-4 路径,classmap 那条记录等于没用。
这个优先级设计本意是鼓励规范优先,但容易掩盖配置问题:比如你把 AppUser 类放在 app/User.php,却在 composer.json 里写成 "App": "src/",结果 psr-4 查不到,才退到 classmap——你以为是 classmap 生效了,其实是 psr-4 配错了。
- 验证是否真走 psr-4:检查
vendor/composer/autoload_psr4.php里有没有对应映射 - 验证是否 fallback 到 classmap:搜索
vendor/composer/autoload_classmap.php里有没有该类名 - 开发中别加
-o参数,否则 classmap 不自动刷新,容易误判代码没生效
改完 autoload 为什么 new User() 还是 Class not found
Composer 不监听文件系统变化,所有 autoload 配置都是静态生成的。改完 composer.json 或新增类文件后,不执行 composer dump-autoload,就等于什么都没做。
更隐蔽的问题是执行位置不对:必须在 composer.json 所在目录下运行命令。人在 src/ 子目录里敲 composer dump-autoload,命令会静默失败,且不报错。
- 确认当前目录就是
composer.json所在路径(可用pwd或ls composer.json验证) - 如果用了 Composer 插件(如
hirak/prestissimo),可能缓存干扰,可临时加--no-plugins重试 - CI 环境若用了
--no-dev,autoload-dev下的映射完全不可用,测试类会直接找不到 - PSR-4 映射漏掉命名空间末尾反斜杠(如写成
"App"而非"App\")会导致静默失效,dump-autoload 也不报错
vendor/composer/autoload_classmap.php 看一眼,确认关键类名确实在里面。










