composer仅支持psr-4、classmap、files和已废弃的psr-0四种自动加载方式,不支持带动态前缀/后缀的非标命名空间;非标命名空间如legacy_需用classmap扫描并手动更新autoload映射。

Composer 本身不支持“带特定前后缀的非标命名空间规则”——它只认标准 PSR-4(或已废弃的 PSR-0)、classmap、files 四种方式。所谓“非标前缀/后缀”,比如 AppDevV2 或 Legacy_ 这类命名习惯,不是 Composer 的加载逻辑能自动识别的,必须靠人工对齐或绕过机制。
PSR-4 不接受动态或条件化前缀
你不能在 composer.json 里写类似 "App{ENV}\" 或 "AppDev*\" 这样的通配符或变量插值。Composer 解析 psr-4 时只做字符串前缀匹配,且要求:
-
"AppDev\"必须原样出现在 namespace 声明里,多一个空格、少一个反斜杠("AppDev"或"AppDev\")都会导致整个映射失效 - 路径必须真实存在:
"AppDev\": "src-dev/"要求项目根目录下真有src-dev/目录 - 命名空间和目录结构仍需逐字符对齐:
AppDevHttpControllers→src-dev/Http/Controllers/
非标命名空间(如 Legacy_)只能走 classmap
如果类名是 Legacy_UserHelper、Old_Core_Utils 这类下划线分隔、无命名空间或命名空间不规范的旧代码,PSR-4 无法处理——它不解析下划线,也不 fallback 到根目录找文件。
正确做法是用 classmap 扫描:
- 在
composer.json中添加:"classmap": ["legacy/", "old-lib/"] - 运行
composer dump-autoload(开发时)或composer dump-autoload --optimize(生产) - Composer 会递归扫描这些路径下所有
.php文件,提取class和interface声明,生成静态映射表vendor/composer/autoload_classmap.php - 注意:新增类后必须重跑
dump-autoload,否则不会被加载
files 加载不参与类查找,只适合函数/常量
别指望用 files 实现“非标命名空间自动加载”。它的作用是无条件 include 指定文件,跟类名无关:
-
"files": ["src/helpers.php"]会在每次加载vendor/autoload.php时执行一次 - 如果
helpers.php里定义了function legacy_do_something(),那它可用;但定义class Legacy_Foo就不行——因为Legacy_Foo类名不会触发任何 autoload 回调,PHP 找不到它 - 多个
files的执行顺序不可控,有依赖关系时容易出错
真正卡住人的地方,往往不是不会配,而是误以为 Composer 能“理解语义”——它只做字符串替换或文件扫描,不推理、不猜测、不 fallback。非标规则要么重构为 PSR-4,要么老老实实用 classmap 覆盖,没有中间路线。











