PHP: Зачем следовать PSR-20

Источник: «Why You Should Follow PHP Standards Recommendation 20 to Get the System Clock»
Недавно была выпущена спецификация PHP Standards Recommendation 20, призванная помочь разработчикам использовать общий интерфейс получения системных даты и времени. Это важная рекомендация, если вам необходимо протестировать PHP код, манипулирующий системной датой и временем.

Что такое PHP Standards Recommendation 20 - PSR 20

PHP Standards Recommendation, так же известные как PSR, результат работы PHP Framework Interoperability Group (FIG). Это группа PHP разработчиков, сосредоточенных на достижении соглашения об общепринятой практики, которую другие разработчики могут принять в качестве стандартов.

Эта группа разработала множество спецификаций для различных аспектов реализации PHP приложений.

PSR-20 — спецификация для определения интерфейса класса, который возвращает текущее время.

Зачем следовать PSR-20 для получения системного времени и даты

В PHP уже есть встроенные функции и классы, возвращающие текущее системное время и дату. Например, функция time() возвращает системное время в секундах.

Эти функции и классы даты, и время прекрасно подходят для реализации PHP приложений.

Проблемы начинаются, когда нужно создать тесты проверки кода приложения. Код, зависящий от системного времени, будет использовать разные значения времени при каждом запуске тестов.

Мы можем использовать фиктивные (mock) классы, обернув в них функции и классы, получающие системное время и дату для решения проблемы. Таким образом мы сможем использовать их для тестов, использующих одно и тоже системное время не зависимо от того, когда этот класс вызвали.

PSR-20 определяет ClockInterface, поэтому вы можете задать классы, возвращающие объект DateTimeImmutable.

namespace Psr\Clock;

interface ClockInterface
{
/**
* Возвращает текущее время, как объект DateTimeImmutable
*/

public function now(): \DateTimeImmutable;

}

Фактическая реализация этого интерфейса может возвращать объект DateTimeImmutable с текущей датой и временем системных часов.

class Clock implements Psr\Clock\ClockInterface
{
public function now()
{
return new \DateTimeImmutable('now');
}
}

Фиктивная (mock) реализация этого интерфейса для тестов может возвращать объект DateTimeImmutable с фиксированной датой и временем.

Используя фиктивный (mock) класс для получения даты и времени системных часов, результаты ваших тестов не будут меняться каждым новым запуском тестов.

class MockClock implements Psr\Clock\ClockInterface
{
public function now()
{
return new \DateTimeImmutable('2023-01-01');
}
}

Когда нужно следовать PSR-20

Как следует из названия, PSR (PHP Standards Recommendation) — это всего лишь рекомендация. Вы не обязаны её использовать. Вы можете использовать её, когда это имеет смысл.

Следование этой рекомендации было бы новой привычкой кодирования, если бы у вас не было привычки использовать класс для получения системного времени. Выработать новую привычку не просто. Требуется время для адаптации.

Если у вас есть проекты, которые работают хорошо, внесение изменений может отнять много времени для внесения изменений по использованию этой рекомендации для получения системной даты и времени.

Даже с лучшими инструментами рефакторинга кода ваш код может сломаться из-за неожиданных побочных эффектов.

Предлагаю использовать новую рекомендацию только для новых проектов. Если вы последуете моему совету, то поймёте, что можно легко принять эту рекомендацию с минимальным риском сломать код.

В общем рассмотрите возможность следования этой и другим рекомендациям новых стандартов только для будущих проектов.

Дополнительные материалы

Предыдущая Статья

Laravel: 4 инструмента для статического анализа

Следующая Статья

CSRF: Подделка межсайтовых запросов