
psr/clock使用指南通过构造器注入获取当前时间的正确姿势【免费下载链接】clockPSR-20 repository项目地址: https://gitcode.com/gh_mirrors/clo/clockpsr/clock是 PHP-FIG 发布的 PSR-20 标准仓库它只定义了一个读取当前时间的通用接口ClockInterface。本文面向新手用最少的篇幅讲清楚为什么要用它、如何安装、以及如何通过构造器注入让获取当前时间变得可控、可测试。为什么需要 psr/clock⏰在业务代码里直接写new DateTimeImmutable()拿当前时间是最自然的写法但会带来两个老问题痛点说明 不好测试依赖墙上时间的逻辑如订单超时、日志打点、过期校验每次测试跑到真实时间断言很难写 强耦合时间来源被写死在类内部想换时间源比如时区修正、重放历史时间只能改代码psr/clock 的思路很简单把时间来源抽象成接口由外部注入。你的类只依赖ClockInterface运行期和测试期各传各的实现即可。一键安装步骤 一条命令装好零配置composer require psr/clock这个包极其轻量——整个src/目录只有一个接口文件 src/ClockInterface.php核心就一行方法声明public function now(): DateTimeImmutable;now()返回不可变的DateTimeImmutable对象任何时钟实现只要提供这个方法就能被你的代码使用。通过构造器注入获取当前时间的正确姿势 以给订单记录下单时间为例正确姿势是接口注入 构造器传参?php use Psr\Clock\ClockInterface; use DateTimeImmutable; class OrderService { private ClockInterface $clock; public function __construct(ClockInterface $clock) { $this-clock $clock; } public function placeOrder(): DateTimeImmutable { // 时间来源由注入的时钟决定而不是写死 return $this-clock-now(); } }这里的关键点类型提示写接口不写具体类OrderService不知道也不需要知道时钟是谁实现的构造器注入谁创建OrderService谁就决定时间从哪来返回DateTimeImmutable拿到后随意取年份、月份、时间戳值不会被意外篡改。选择或实现一个时钟 psr/clock 官方声明它本身不是时钟只是接口。仓库的 README.md 中明确提示你需要另行选择一个实现了ClockInterface的包。选现成的用 composer 搜索声明了psr/clock-implementation的包很多框架和日期库都自带实现自己实现只需implements ClockInterface并实现now()同时建议在 composer.json 的provide段声明方便其他包发现你{ provide: { psr/clock-implementation: 1.0 } }测试时最爽的用法冻结时间 既然时间源可注入测试里传一个固定时钟就能把时间钉死在任意一刻?php use Psr\Clock\ClockInterface; use DateTimeImmutable; class FixedClock implements ClockInterface { private DateTimeImmutable $fixed; public function __construct(DateTimeImmutable $fixed) { $this-fixed $fixed; } public function now(): DateTimeImmutable { return $this-fixed; } }// 无论测试何时运行现在永远是 2026-01-01 $clock new FixedClock(new DateTimeImmutable(2026-01-01 00:00:00)); $service new OrderService($clock); // 对下单时间 2026-01-01的断言从此稳定通过 ✅过期判断、节假日逻辑、时区转换……所有与时间有关的测试都不再看天吃饭。常见问题速答 psr/clock 能直接拿来取时间吗不能。它只定义接口见 README.md 开头的声明需要另选或自实现一个时钟。支持哪些 PHP 版本PHP 7.0 及以上、8.x 全系。依据见 composer.json 中的php: ^7.0 || ^8.0。和date(Y-m-d H:i:s)有什么区别date()/time()把时间源写死在函数内部ClockInterface把时间源变成可替换的依赖可冻结、可重放、可打桩。版本会怎么演进当前已是 1.0.0 稳定版PSR-20 被正式接受后的首个稳定发布变更记录见 CHANGELOG.md。写在最后 ✅psr/clock PSR-20 标准核心只有ClockInterface::now()一个方法安装composer require psr/clock使用构造器注入ClockInterface业务代码里统一$this-clock-now()取当前时间收益生产用真实时钟测试用固定时钟——时间相关的 bug 从此可控可复现。花一分钟做这个小重构你的代码就能获得时间自由。【免费下载链接】clockPSR-20 repository项目地址: https://gitcode.com/gh_mirrors/clo/clock创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考