cemerson/clock

此包已被废弃且不再维护。作者建议使用 psr/clock 包。

PHP 7+ 的超简单时钟抽象,允许开发者正确模拟时间相关函数

v3.0 2022-11-26 20:03 UTC

This package is auto-updated.

Last update: 2022-11-26 20:05:21 UTC


README

!已弃用 - 不要使用!

自创建此包以来,PSR-20 已被提出并接受,与该包具有相同的功能。强烈建议您使用 PSR-20 而不是此包,因为它可能会在未来获得更多的社区支持和兼容性。

v2.0 和 v3.0 的 cemerson/clock 包包括一个适配器,可以帮助切换到 PSR-20 兼容的时钟接口,同时提供的 WallClock 实现也实现了新的接口。您应该将依赖代码切换到使用 ClockInterface。v2.0 实现了 stella-maris/clock 的接口,该接口在 PSR-20 开发期间提供了类似 PSR-20 的接口。v3.0 删除了这个依赖,现在直接实现了已最终确定并接受的 PSR-20 接口。

简单来说;将不再对此包进行任何工作!将您的代码迁移到使用 psr/clock

原始 ReadMe

您可以使用此库来帮助测试那些以某种方式依赖于时钟的应用程序。

理由

单元测试最好完全与环境隔离,并且永远不访问该环境的一部分,例如数据库、文件系统、网络套接字,甚至是当前时间。我遇到过多个单元测试的例子,其结果会根据您运行它们的时间而变化,因为它们依赖于 PHP 时间函数,并且随着行为的变化而变化。

能够测试一些类使用不同的时间或日期相关输入是很重要的,以便测试不同的方面。一些库允许您通过调用一些代码来更改内置时间函数的结果,但对我来说,解决方案要简单得多 - 您应该通过将其注入到类中来隔离您的代码与时钟,从而允许您使用您喜欢的单元测试框架来模拟结果。

我迄今为止找到的库要么是作为更大库的一部分,我并不需要所有这些复杂性,要么是没有标记稳定版本的发布,要么有其他问题,因此我创建了此库作为替代。我经常在应用程序中创建类似的接口,并认为我最好将其制作成一个可重用的组件。

它故意设计得非常简单,没有任何花哨的功能,只包含足够的功能来实现所需的结果,而不添加任何额外的复杂性。

安装

Clock 需要 PHP 7。通过 composer 安装

composer require cemerson/clock

使用方法

当您有一个需要引用当前时间的类时,不要调用任何与时间相关的 PHP 函数。相反,提示并注入此库中的 Clock 接口。

在生产环境中,您可以设置依赖注入容器以注入提供的 Wallclock 类来获取当前时间。该类在构造函数中接收一个 DateTimeZone 对象,并在其 getDateTime() 方法被调用时,提供一个包含当前时间的 DateTimeImmutable 对象,并使用提供的时区。

<?php declare(strict_types = 1);

namespace MyVendor\MyApp;

use CEmerson\Clock;

class MyClass
{
    /** @var Clock */
    private $clock;
    
    public function __construct(Clock $clock)
    {
        $this->clock = $clock;
    }
    
    public function myMethodThatNeedsCurrentTime()
    {
        $currentDateTime = $this->clock->getDateTime();
        
        /* ... */
    }
}

或者,如果您需要不同的功能,或者需要 DateTimeInterface 的可变版本,您可以创建自己的 Clock 接口实现。

在测试期间,您可以使用您最喜欢的模拟框架创建 Clock 接口的模拟,以提供您喜欢的任何时间/日期组合,甚至可以使用您不太喜欢的模拟框架。