composer 2.0+ 已彻底移除 psr-0 支持,psr-0 字段被静默忽略;需改用 spl_autoload_register 手动实现下划线转斜杠逻辑,或改用 classmap 方式加载旧类库。

Composer 2.0+ 已彻底移除 PSR-0 支持,psr-0 字段在 composer.json 中会被静默忽略,不会生成任何加载逻辑——这不是配置写错,而是代码层已删除。
composer.json 里写 psr-0 为什么没用
你看到的 psr-0 配置块,在 Composer 2.0 及以上版本中根本不会被解析。运行 composer dump-autoload 后,vendor/composer/autoload_psr0.php 文件压根不会生成,vendor/autoload.php 里也找不到对应注册逻辑。
- 典型现象:
Class 'Swift_Mailer' not found,但vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mailer.php确实存在,且类名、路径、下划线转斜杠规则都对 -
psr-4和psr-0同时存在时,Composer 直接跳过psr-0,只处理psr-4 - 哪怕降级到 Composer 1.x,也不推荐:PHP 8.3+ 兼容差、安全漏洞多、Laravel 11 等现代框架不支持
手动注册 spl_autoload_register 补 PSR-0 逻辑
这是唯一能在 Composer 2.0+ 下让旧类库(如 Swiftmailer 4.x、PEAR 包)正常工作的通用方式,核心是严格还原 PSR-0 规则:下划线 → 斜杠、全小写、加 .php 后缀。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须放在
require_once __DIR__ . '/vendor/autoload.php';之后 - 必须检查
class_exists($class, false)和interface_exists($class, false),避免重复加载 - 路径拼接要精准,比如 Swiftmailer 的实际路径是
__DIR__ . '/vendor/swiftmailer/swiftmailer/lib/classes/',不能靠猜 - 只处理含下划线的类名(
strpos($class, '_') !== false),防止干扰 PSR-4 类
require_once __DIR__ . '/vendor/autoload.php';
spl_autoload_register(function ($class) {
if (false === strpos($class, '_') || class_exists($class, false) || interface_exists($class, false)) {
return;
}
$file = __DIR__ . '/vendor/swiftmailer/swiftmailer/lib/classes/' . str_replace('_', '/', strtolower($class)) . '.php';
if (is_file($file)) {
require_once $file;
}
});
改用 classmap 是更稳的选择
如果旧类库只有少量固定文件(比如 Console_Table、HTTP_Request、DB),classmap 比手写 autoload 更轻量、更可控,且不受 PHP 版本或 Composer 大版本限制。
- 配置示例:
"autoload": { "classmap": ["vendor/pear/console_table/Console/Table.php", "vendor/pear/http_request/HTTP/Request.php"] } - 执行
composer dump-autoload -o后,这些路径会直接写进vendor/composer/autoload_classmap.php,查找是 O(1) 性能 - 不会受命名空间或下划线规则影响,只要文件存在、类定义正确就能加载
- 比
psr-0更适合“零星遗留类”,也更容易测试和验证
真正麻烦的不是写几行 spl_autoload_register,而是得确认每个旧类的实际安装路径、是否被其他包覆盖、是否依赖未声明的全局函数——这些细节不查 vendor 目录结构和类文件本身,光看文档永远对不上。










