1<?php
2
3/**
4 * メモ化のための基本クラス
5 */
6class Memoizer
7{
8 private array $cache = [];
9 private array $timestamps = [];
10
11 /**
12 * 関数をメモ化する
13 *
14 * @param callable $fn メモ化する関数
15 * @return callable メモ化された関数
16 */
17 public function memoize(callable $fn): callable
18 {
19 return function (...$args) use ($fn) {
20 $key = $this->generateCacheKey($args);
21
22 if ($this->hasValidCacheEntry($key)) {
23 error_log("キー: $key のキャッシュヒット");
24 return $this->cache[$key];
25 }
26
27 $result = $fn(...$args);
28 $this->cache[$key] = $result;
29 $this->timestamps[$key] = time();
30 error_log("キー: $key の新規計算");
31
32 return $result;
33 };
34 }
35
36 /**
37 * ユニークなキャッシュキーを生成
38 */
39 private function generateCacheKey(array $args): string
40 {
41 return md5(serialize($args));
42 }
43
44 /**
45 * キャッシュエントリが有効かチェック
46 */
47 private function hasValidCacheEntry(string $key): bool
48 {
49 return isset($this->cache[$key]);
50 }
51
52 /**
53 * キャッシュをクリア
54 */
55 public function clearCache(): void
56 {
57 $this->cache = [];
58 $this->timestamps = [];
59 }
60}