composer 2.0+ 彻底移除 psr-0 支持,所有 psr-0 配置被静默忽略;加载需手动用 spl_autoload_register 实现或改用 classmap 显式映射。

Composer 2.0+ 完全不处理 psr-0 字段,任何在 composer.json 中写的 "psr-0" 都会被静默跳过——这不是配置错,是功能已删除。
为什么 PSR-0 类在 Composer 2.x 里根本加载不了
PSR-0 被 PHP-FIG 在 2014 年正式弃用,Composer 从 v2.0 起彻底移除全部相关逻辑。即使你写了 "psr-0": {"MyLib_": "vendor/mylib/src/"},composer dump-autoload 也不会生成任何映射,vendor/autoload.php 里也完全没这条规则。
- 常见错误现象:
Class 'MyLib_Utils' not found,但文件确实在vendor/mylib/src/mylib/utils.php,且类名、路径、下划线转斜杠都符合 PSR-0 规则 - 不是
dump-autoload没运行,也不是路径写错,而是 Composer 根本没注册这个加载器 -
--verbose下也看不到警告,它连解析都不做,直接丢弃整个psr-0键
手动补 PSR-0 加载器的正确写法
唯一可行路径是在项目入口(如 index.php 或 bootstrap.php)中,于 require_once 'vendor/autoload.php' 之后,用 spl_autoload_register() 补一条严格遵循 PSR-0 规则的加载逻辑。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须先检查
strpos($class, '_') !== false,否则会干扰 PSR-4 加载器(比如App\Controller里带下划线就误判) - 必须调用
class_exists($class, false)和interface_exists($class, false)提前返回,避免重复加载 -
explode('_', $class)后要用strtolower(implode('/', $parts)),不能保留大小写(MyLib_Utils→mylib/utils.php,不是MyLib/Utils.php) -
$file路径中的根目录(如vendor/mylib/src/)必须硬编码匹配实际安装位置,不能靠getcwd()或相对路径推导 - 务必加
is_file($file)判断,否则遇到不存在的类会触发Warning: require_once(): failed to open stream
比手写 autoload 更稳的替代方案:classmap
如果这个 PSR-0 类库结构固定、文件数量少(比如 ≤10 个),直接用 classmap 显式声明比 runtime 补加载更可靠,也更容易排查路径问题。
- 在
composer.json的autoload段里加:"classmap": ["vendor/mylib/src/"] - 运行
composer dump-autoload -o,Composer 会扫描该目录下所有.php文件并生成完整路径映射 - 不需要改类名、不用动目录结构,也不依赖下划线语义——只要文件存在,就能被加载
- 注意别把
tests/或examples/目录混进classmap,否则autoload_classmap.php体积暴涨,构建变慢 - 如果类库用了
files加载全局函数(如"files": ["vendor/mylib/src/helpers.php"]),这些文件不会被-o收录,得保留在files里显式加载
性能优化时最容易被忽略的点
启用 --optimize-autoloader(或 -o)对 PSR-0 类库几乎无效——因为 Composer 2.x 根本不扫描 PSR-0 目录。真正起作用的是你手动补的 spl_autoload_register() 或 classmap 扫描结果。
-
--classmap-authoritative对 classmap 有效,但对手动写的 PSR-0 加载器无影响;它只关闭 Composer 自身的 fallback 查找 - APCu 缓存(
--apcu)只能缓存 Composer 生成的映射,无法加速你手写的spl_autoload_register()里的is_file()调用 - OpCache 必须开启,否则
vendor/autoload.php和你手写的加载器每次都要重新编译,优化效果归零 - 本地开发时,别在
composer.json里设"optimize-autoloader": true—— 新增类后不dump-autoload -o就加载失败,且无明确提示










