Ответ
Нет, функция time() в PHP не является чистой.
Чистая функция должна соответствовать двум критериям:
- Детерминированность: Для одинаковых входных аргументов всегда возвращает одинаковый результат.
- Отсутствие побочных эффектов (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);