dobrosite / time-service
PHP时间服务
1.0.0
2022-07-21 18:47 UTC
Requires
- php: ^8.0
Requires (Dev)
- infection/infection: 0.26.5
- phpstan/extension-installer: ^1.1
- phpstan/phpstan: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: 9.5.16
- squizlabs/php_codesniffer: ^3.7
This package is auto-updated.
Last update: 2024-09-14 14:45:12 UTC
README
提供获取当前时间和时区的接口及简单实现。
使用new DateTimeImmutable()
、date_create()
等常见方法确定当前时间有什么缺点?
- 你依赖于无法控制的全局状态。只要任何使用的第三方库更改了时区,上述构造就会返回不同时区的时间。这可能在特定条件下发生,调试时很难发现。
- 此类代码难以测试。在测试中比较实际时间和真实时间变成了一场带有时间间隔容差的赌博。或者根本不检查测试中的时间。
一种可能的解决方案是,你的代码调用的时间服务以获取当前时间。示例
<?php use DobroSite\TimeService\TimeService; class SomeService { private TimeService $timeService; // Внедряем в ваш класс службу времени в качестве зависимости. public function __construct(TimeService $timeService) { $this->timeService = $timeService; } public function someMethod(): void { // Когда вам потребуется текущее время, обратитесь к службе времени: $currentTime = $this->timeService->getCurrentTime(); } }
- 你可以完全控制应用程序中的时间。使用不同的
TimeService
接口实现,你可以从不同的来源获取时间:系统时间、NTP服务器等。你还可以在配置中设置所需的时区,该时区不能被第三方代码无意识更改。 - 你可以在测试中替换时间服务以测试代理,以便测试代码接收预定义的时间。
- 编写自己的实现后,你可以通过设置相对于当前时间的偏移来使应用程序跳到未来或过去。这在验收测试中非常有用,可以检查在执行某些操作后经过一段时间应该执行的功能。
安装
composer require dobrosite/time-service
使用
TimeService
将TimeService接口作为依赖项用于需要获取当前时间的类中。
你可以编写自己的接口实现,或者使用现成的实现
- PhpTimeService — 使用PHP内置功能。
测试
TestTimeService
始终返回指定时间的测试代理TimeService。可以通过TestTimeService::setCurrentTime()
方法设置所需的时间。