5分钟上手psr/clock:从composer安装到第一个now()调用的快速教程
【免费下载链接】clockPSR-20 repository项目地址: https://gitcode.com/gh_mirrors/clo/clock
psr/clock 是 PSR-20 官方标准库,提供统一的时钟读取接口ClockInterface。本文带你用 5 分钟完成 composer 安装,读懂唯一的方法now(),并写出第一个获取当前时间的调用,彻底告别 PHP 项目中"时间不好测"的烦恼。
为什么需要 psr/clock?
在写 PHP 业务代码时,"获取当前时间"看似简单,却藏着两个经典痛点:
- 测试困难:代码里到处散落
new DateTimeImmutable(),单元测试想固定"当前时间"只能依赖系统时间,结果不可控; - 格式混乱:有的地方返回字符串,有的地方返回
DateTime,团队协作时语义不统一。
psr/clock 给出的答案只有一个:一个极简接口。你的业务类只依赖ClockInterface,不关心时间从哪来;测试时再注入一个"假时钟",一切迎刃而解。
💡 注意:psr/clock本身不是一个时钟,它只定义接口(这是 README.md 中特别强调的一点),真正干活的是社区的各种时钟实现。
30秒完成 composer 安装
前提条件:PHP^7.0 || ^8.0(见 composer.json 的require段),任意主流 PHP 版本均可。
在你的项目根目录执行:
composer require psr/clock执行完毕后,接口文件会自动出现在vendor/psr/clock/src/下,命名空间按 PSR-4 映射为Psr\Clock\。
如果你需要直接拉取仓库源码研究,可以执行:
git clone https://gitcode.com/gh_mirrors/clo/clock认识核心文件:一行方法的 ClockInterface
整个库的核心只有一个接口文件src/ClockInterface.php,全部逻辑如下:
namespace Psr\Clock; use DateTimeImmutable; interface ClockInterface { /** * Returns the current time as a DateTimeImmutable Object */ public function now(): DateTimeImmutable; }记住两个关键点即可:
| 要素 | 内容 |
|---|---|
| 唯一方法 | now() |
| 固定返回类型 | DateTimeImmutable(不可变时间对象) |
就这一个方法,没有时区参数、没有格式化参数——PSR-20 的设计哲学就是"少即是多"。
写出第一个 now() 调用
以下示例与官方 README.md 中的 Usage 章节一致,演示了推荐的构造器注入写法:
<?php use Psr\Clock\ClockInterface; class Foo { private ClockInterface $clock; public function __construct(ClockInterface $clock) { $this->clock = $clock; } public function doSomething() { /** @var DateTimeImmutable $currentDateAndTime */ $currentDateAndTime = $this->clock->now(); // do something useful with that information } }三步理解这段代码:
- 类
Foo不直接取时间,而是依赖注入一个ClockInterface; - 调用
$this->clock->now()拿到DateTimeImmutable类型的当前时间; - 依赖容器或工厂决定注入哪个实现——业务代码对具体实现零感知。
选一个时钟实现(implementation)
装了 psr/clock 后,还需给Foo注入一个具体实现。在 Packagist 上搜索psr/clock-implementation关键字,可找到所有声明了该标签的包,挑选一个composer require即可,例如常见的symfony/clock或laravel/clock风格实现,均实现了Psr\Clock\ClockInterface。
自己动手实现一个时钟?
如果你要发布自己的时钟包,只需做两件事:
- 让类
implements \Psr\Clock\ClockInterface,并在now()中返回DateTimeImmutable; - 在包的
composer.json中声明:
{ "provide": { "psr/clock-implementation": "1.0" } }这样依赖它的项目才能按标准发现你的实现。
常见问题 FAQ
Q:psr/clock 能直接new出来用吗?不能。它是纯接口包,没有任何类实现,必须搭配一个 implementation 使用。
Q:支持哪些 PHP 版本?^7.0 || ^8.0,即 PHP 7.0 及以上全系列。
Q:和直接调用date('Y-m-d')有什么区别?now()强制返回不可变的DateTimeImmutable对象,类型安全、可注入、可测试,是框架与中间件之间交换时间的标准载体。
Q:项目版本有哪些节点?可查看 CHANGELOG.md:0.1.0为首发版本,1.0.0是 PSR-20 被正式接纳后的首个稳定版。
总结:5分钟回顾
- ✅
composer require psr/clock完成安装,PHP 7.0+ 即可 - ✅ 核心接口
src/ClockInterface.php只有一个方法:now(): DateTimeImmutable - ✅ 业务代码通过构造器注入
ClockInterface,测试时换假时钟即可 - ✅ 搭配任意
psr/clock-implementation实现包,就能在真实项目中跑起来
从安装到第一个now()调用,你只用了 5 分钟。接下来,试着把手头项目里散落的new DateTimeImmutable()全部换成注入的时钟,你会体验到"时间可控"的爽快感。
【免费下载链接】clockPSR-20 repository项目地址: https://gitcode.com/gh_mirrors/clo/clock
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考