psr-4对legacy_类完全无效,因其仅匹配带命名空间前缀的类名,不解析下划线、不支持无命名空间类、不fallback到根目录,且要求目录结构与命名空间严格逐字符对齐;legacy_userhelper等旧式类必须用classmap加载。

直接用 classmap,别碰 psr-4 或 files——前者根本匹配不了无命名空间类,后者只加载文件、不参与类查找。
为什么 psr-4 对 Legacy_ 类完全无效
PSR-4 的匹配逻辑是「命名空间前缀 + 目录路径」严格对齐,它不会解析下划线、不 fallback 到根目录、也不识别 Legacy_UserHelper 这种旧式类名。哪怕你在 composer.json 里写 "Legacy_": "legacy/",Composer 也会跳过——因为它只认 namespace Legacy_ 开头的文件,而老代码通常连 namespace 声明都没有。
-
Legacy_UserHelper是全局类,不是命名空间类,PSR-4 根本不处理 - 即使你手动加
namespace Legacy_,目录结构也得是legacy/UserHelper.php,但老项目往往是legacy/user_helper.php或legacy/classes/user_helper.php,路径和命名都不对 - 试图用通配符(如
"Legacy*": "legacy/")或变量插值(如"App{ENV}": "src-env/")会直接报错:Composer 不支持任何动态语法
classmap 是唯一靠谱的选择
classmap 不看命名空间、不依赖文件名规则,只做一件事:递归扫描指定路径下所有 .php 文件,提取 class、interface、trait 声明,生成静态映射表 vendor/composer/autoload_classmap.php。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 配置方式:在
composer.json的autoload或autoload-dev下加"classmap": ["legacy/", "old-lib/"] - 路径必须真实存在,且是目录(不是 glob 模式),Composer 会自动递归子目录
- 新增类后必须重跑
composer dump-autoload,否则不会被加载——这是最容易漏掉的操作 - 如果老代码混在 vendor 外部(比如
/var/www/lib/),确保路径是相对于项目根目录的相对路径,或用符号链接统一收口
files 和 classmap 别混用,尤其别指望 files 加载类
files 的作用是无条件 include_once 指定文件,适合加载函数、常量或配置,但它不注册类到 autoloader 机制里。
- 写
"files": ["legacy/helpers.php"],里面定义了function legacy_do_something()→ 可用 - 但同一文件里写了
class Legacy_Foo→ PHP 找不到这个类,因为files不触发 autoload 回调,也不会写进autoload_classmap.php - 多个
files的执行顺序不可控,如果有依赖关系(比如 A.php 依赖 B.php 里的函数),容易出错 - 如果既用了
classmap又写了files加载含类的文件,类可能被重复定义,导致Fatal error: Cannot declare class
生产环境启用 classmap-authoritative 要格外小心
--classmap-authoritative 强制关闭 PSR-4 fallback,只查 autoload_classmap.php,性能确实提升,但前提是 classmap 必须覆盖所有生产用到的类。
- 必须加
--no-dev,否则 dev-only 类会残留,触发 fallback - 不能有
files加载的类,它们不会进 classmap,但又必须存在,否则运行时报错 - 老项目常有运行时
eval()或spl_autoload_register()动态加载的类,这类无法被classmap扫描到,启用了 authoritative 就会直接失败 - 验证是否生效:检查
vendor/composer/autoload_real.php中的findFile方法,若只剩$classMap分支、没有$prefixesPsr4相关逻辑,才算真正启用
最常被忽略的一点:classmap 扫描是静态的,它不会感知文件内容变更。改了类名、删了类、或者把 Legacy_UserHelper 重命名为 UserHelper,都得手动再跑一次 dump-autoload,否则旧映射还在,新类找不到,旧类还报重定义。










