PSR包是PHP标准接口契约而非功能实现,仅定义如LoggerInterface等抽象规范,需Monolog等具体库实现;Composer安装它只为声明兼容标准并统一依赖协议。

PSR包不是功能库,是“契约说明书”
PSR系列包(比如 psr/log、psr/http-message)本身不提供日志写入、不发送HTTP请求——它们只定义接口,像一份法律合同:规定“日志必须有 info() 和 error() 方法”,“请求对象必须能返回 getUri()”。你项目里用的 Monolog 或 Guzzle,才是按这份合同履约的“施工队”。
- 装
psr/log不会多出一个日志功能,它只有PsrLogLoggerInterface一个接口文件 - Composer 安装它,本质是声明:“我这个项目遵守 PSR-3 日志规范”,方便其他组件(如 Laravel、Symfony)安全注入或替换实现
- 如果你在
composer.json里写了"psr/log": "^3.0"却没 anywhere 实现它,代码照样跑,但框架可能拒绝启动(比如某些容器校验接口存在性)
为什么 Composer 要拉取这些“空接口”包?
因为 Composer 管理的是「依赖声明」,不是「功能实现」。PSR 包是 PHP-FIG 统一发布的标准契约,版本号代表契约条款的演进(例如 psr/http-message 1.x 和 2.x 在 withHeader() 返回值上不兼容)。Composer 拉取它们,是为了让所有参与者对齐同一份接口协议。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 没有 PSR 包,你就得自己写
interface LoggerInterface { ... },结果每个团队定义的log()参数顺序、是否接受上下文数组,全都不一样 - 框架(如 Slim)在接收中间件时,只认
PsrHttpMessageResponseInterface,不认GuzzleHttpPsr7Response—— 后者只是前者的实现之一 -
composer require psr/container后,ContainerInterface就成了你和 DI 容器之间的通用语言,Laravel 的Application、PHP-DI 的Container都实现了它
常见错误:把 PSR 接口当具体类用
新手常直接 new 一个 PSR 接口,或者试图 use PsrLogLoggerInterface 然后调 LoggerInterface::info(),立刻报错:Fatal error: Interface 'PsrLogLoggerInterface' not found 或 Cannot instantiate interface。
- PSR 接口不能被实例化,必须由具体类实现(如
MonologLogger) - 别在业务代码里
new PsrLogLoggerInterface,而应通过构造函数类型提示 + 依赖注入传入实现 - 如果 IDE 提示 “class not found”,先确认是否漏装实现库(如
monolog/monolog),而不是怀疑 PSR 包没装对 - 检查
vendor/composer/autoload_psr4.php:PSR 包的自动加载项通常只映射到src/下的接口文件,不含任何 .php 类实现
PSR-4 自动加载和 PSR 接口包的关系
PSR-4 是路径映射规则,PSR 接口包是内容标准——两者靠 Composer 黏合。当你执行 composer install,Composer 读取 PSR-4 配置(比如 "Psr\Log\": "src/"),再结合接口包里的 src/LoggerInterface.php,最终让 new PsrLogLoggerInterface() 这种写法在语法层面“可解析”,哪怕运行时报错。
- PSR-4 不负责“实现”,只保证
use PsrLogLoggerInterface能成功定位到那个空接口文件 - 如果你自己写个包想兼容 PSR,就必须在
composer.json中声明"autoload": { "psr-4": { "MyVendor\": "src/" } },且类路径严格匹配命名空间 - 别手动改
vendor/autoload.php去“绕过”PSR-4——那等于撕掉合同自己另立规矩,后续升级或换框架时大概率崩
guzzlehttp/guzzle:^7.0,它要求 psr/http-message:^1.0;若你项目里又引入了另一个库强制要 ^2.0,Composer 直接拒绝安装——这不是 bug,是契约冲突。

















