Выбор ответа Senior PHP 8.x: enum, readonly, match обновлено

WeakMap для кеша по объектам

Вопрос

Зачем нужен WeakMap (PHP 8.0), если есть SplObjectStorage?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: WeakMap не удерживает ключи, и кеш не течёт. SplObjectStorage и обычные массивы держат сильные ссылки, поэтому кеш вычислений «по объекту» не даёт GC собрать объекты, и в долгоживущих процессах память растёт.

Варианты ответа

  1. WeakMap быстрее, но в остальном полностью идентичен
  2. WeakMap позволяет использовать строки как ключи
  3. WeakMap не удерживает ключи, и кеш не течётправильный ответ
  4. WeakMap сохраняется между запросами в OPcache

Разбор

SplObjectStorage и обычные массивы держат сильные ссылки, поэтому кеш вычислений «по объекту» не даёт GC собрать объекты, и в долгоживущих процессах память растёт. WeakMap хранит ключи слабо: удалили последнюю ссылку на объект, исчезла и запись. Ключами могут быть только объекты, а жизнь ограничена процессом.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме