Мемоізація - кешування результату функції для вже бачених аргументів: повторний виклик з тими самими аргументами повертає збережене значення без повторних обчислень.
Статична змінна у функції:
function countryName(string $code): string
{
static $cache = [];
return $cache[$code] ??= Country::where('code', $code)->value('name');
}
Властивість об'єкта - кеш живе разом з екземпляром сервісу:
final class ExchangeRates
{
private array $rates = [];
public function rate(string $currency): float
{
return $this->rates[$currency] ??= $this->fetchFromApi($currency);
}
}
WeakMap - коли аргумент - об'єкт, і кеш не має утримувати його в пам'яті:
private WeakMap $totals;
public function total(Order $order): int
{
return $this->totals[$order] ??= $this->calculate($order);
}
У Laravel є хелпер once(): результат замикання кешується на час запиту в межах конкретного об'єкта й місця виклику.
public function permissions(): array
{
return once(fn () => $this->loadPermissionsFromDatabase());
}
Коли мемоізація доречна: функція чиста (той самий вхід - той самий результат), виклики з однаковими аргументами повторюються, а обчислення дороге.
Пастки:
- Довгоживучі процеси. Статична змінна в PHP-FPM живе один запит, а в Octane чи воркері черги - доки живе процес. Кеш накопичується і може віддавати застарілі дані одного користувача іншому.
- Нечисті функції: мемоізувати «поточного користувача» чи «час зараз» - отримати застарілі значення.
- Ключ кешу для кількох аргументів - серіалізувати їх однозначно (
serialize,json_encode), пам'ятаючи про об'єкти. - Мемоізація ≠ кеш застосунку. Вона живе в пам'яті процесу; для спільного між запитами кешу - Redis і
Cache::remember.