一文读懂 PHP PSR 接口 PSR-3、PSR-7、PSR-11、PSR-15 完整指南
现代 PHP 的选择很多。这本来是好事,但一到升级框架、替换 Logger,或在团队间统一服务时,你会发现:看不见的耦合(类型、方法签名、约定)会把小改动变成大手术。
本文用通俗的话讲清四个关键标准——PSR-3(日志)、PSR-7(HTTP 消息)、PSR-11(容器)和 PSR-15(HTTP 中间件)——如何在代码里建立稳定的边界(seams)。入门读者能拿到清晰定义和可直接复用的示例;进阶读者可以参考迁移策略、取舍与度量方法。
你将学到
- 用直白语言解释这些标准到底是什么
- 如何按小步引入,每个 PSR 都附带可直接落地的代码
- 一个小案例:低成本替换第三方库或框架
- 常见坑(不可变性、过度适配、性能顾虑)以及哪些场景不该用 PSR
- 一份检查清单与轻量指标,帮你证明确实降低了锁定(lock-in)
关键概念与定义
什么是 PSR? 由 PHP-FIG 发布的社区标准,侧重接口与规范。它只约定“契约”,不规定实现,因此不同库可以顺畅互通。
接口 vs 实现 接口规定“做什么”,实现负责“怎么做”。代码若依赖接口,就能在不改调用点的前提下替换实现。
PSR-3(日志)
Psr\Log\LoggerInterface 定义了 debug()、info()、error() 等方法,以及通用的 log($level, $message, array $context = [])。任何符合 PSR-3 的 Logger(如 Monolog)都能满足这个契约。
PSR-7(HTTP 消息)
为 HTTP 请求、响应、流、URI、上传文件提供接口(Psr\Http\Message\*)。对象是不可变的,例如 withHeader() 会返回新实例;好处是行为可预测、共享安全。
PSR-11(容器)
Psr\Container\ContainerInterface 是一个很小的依赖注入契约:get(string $id): mixed 与 has(string $id): bool。用它,框架与库之间无需绑定某个特定的 DI 实现。
PSR-15(HTTP 处理器与中间件)
Psr\Http\Server\RequestHandlerInterface 与 MiddlewareInterface 规范了服务器端中间件如何处理 ServerRequestInterface 并返回 ResponseInterface。这是 HTTP 管道的通用形态。
为什么是这四个? 它们覆盖了多数应用的关键边界:日志、HTTP、依赖装配和跨请求的 HTTP 行为。把这些地方标准化,只需很少改动就能显著提升可移植性。
新手提示:若觉得缩写抽象,可以先看示例再回来看定义。进阶提示:这些 PSR 可分步引入,不需要大重构。
分步落地框架
第 1 步 —— 用 PSR 接口包住外部库
先改“你的代码依赖谁”,别急着动第三方库。加一层薄的适配器:业务代码只面向 PSR,适配器去对接具体库。
示例:把遗留 Logger 适配成 PSR-3
[code] |