Вы можете рассмотреть модель наследования на основе интерфейса:
interface iClock
{
public function getTime();
}
class SystemClock implements iClock
{
public function getTime()
{
return time();
}
}
class FakeClock implements iClock
{
private $time;
function __construct($time)
{
$this->time = $time;
}
public function getTime()
{
return $this->time;
}
// you could have more functions to advance the time, etc.
}
Ваши собственные классы, которые должны работать с текущим временем, будут принимать параметр конструктора типа интерфейса iClock
.
class YourOwnClass
{
private $clock;
function __construct(iClock $clock)
{
$this->clock = $clock;
}
function someFunction()
{
$now = $this->clock->getTime();
// whatever
return $now;
}
}
Тогда вы просто введете нужный вам тип часов в зависимости от того, проходите ли вы модульный тест или нет:
$realWorldInstance = new YourOwnClass(new SystemClock());
echo $realWorldInstance->someFunction();
$unitTestInstance = new YourOwnClass(new FakeClock(1234));
echo $unitTestInstance->someFunction();
Кстати, я часто использую этот шаблон вNET также.Он также встроен в интерфейс IClock
, предоставляемый Noda Time .Я не вижу причин, почему этот шаблон не будет работать в PHP.Вы можете вернуть DateTime
вместо только целочисленной отметки времени, но приведенное выше минимальное значение, необходимое для использования шаблона.