Является ли функция time() в PHP чистой (pure function)?

«Является ли функция time() в PHP чистой (pure function)?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, функция time() в PHP не является чистой.

Чистая функция должна соответствовать двум критериям:

  1. Детерминированность: Для одинаковых входных аргументов всегда возвращает одинаковый результат.
  2. Отсутствие побочных эффектов (side-effects): Не изменяет внешнее состояние (глобальные переменные, файлы, БД).

Функция time() нарушает первый критерий, так как ее результат зависит от внешнего, изменяющегося состояния — системного времени.

// НЕ чистая функция: результат разный при каждом вызове.
echo time(); // 1710000000
sleep(1);
echo time(); // 1710000001

Как сделать код, зависящий от времени, тестируемым? Инкапсулируйте зависимость.

// 1. Внедрение зависимости через параметр (предпочтительно для чистоты).
function formatOrderDate(int $timestamp): string {
    return date('Y-m-d H:i:s', $timestamp);
}
// В тесте можем передать любое фиксированное время.
formatOrderDate(1672531200); // '2023-01-01 00:00:00'

// 2. Использование инъекции зависимости в классе.
class TimeSensitiveService {
    private $timeProvider;

    public function __construct(callable $timeProvider = null) {
        $this->timeProvider = $timeProvider ?? 'time';
    }

    public function isCacheValid(int $cacheTime): bool {
        $currentTime = ($this->timeProvider)();
        return ($currentTime - $cacheTime) < 3600;
    }
}
// В продакшене: new TimeSensitiveService();
// В тесте:    new TimeSensitiveService(fn() => 1672531200);