Я бы хотел реализовать функцию кэширования базы данных в PHP на основе количества ссылок. Например, код для доступа к записи в таблице foo
с идентификатором 1 может выглядеть следующим образом:
$fooRecord = $fooTable->getRecord(1);
При первом вызове $fooTable
выбирает соответствующую запись из базы данных, сохраняет ее во внутреннем кеше и возвращает. Любые последующие вызовы getRecord(1)
будут возвращать другую ссылку на тот же объект в памяти. $fooRecord
сигнализирует $fooTable
, когда он разрушается, и если нет оставшихся ссылок, он сохраняет все изменения обратно в базу данных и удаляет их из кэша.
Проблема в том, что управление памятью в PHP абстрагируется от деталей о количестве ссылок. Я искал расширение PECL и Google для этого, но не нашел результатов. Итак, вопрос № 1: существует ли такое расширение?
В альтернативном подходе $ fooTable возвращает супер-подлый поддельный объект. Он притворяется записью, пересылая __call()
, __set()
и __get()
, а его конструктор и деструктор предоставляют соответствующие хуки для подсчета ссылок. Тесты, отлично работает, разве что ломает намеки на тип. Все мои методы, которые ожидали объект FooRecord, теперь получают объект Sneaky, или, возможно, FooSneaky, если мне хочется создать пустой подкласс Sneaky для каждой из моих таблиц , чего у меня нет. Кроме того, я боюсь, что это запутает программистов по обслуживанию (таких как я).
Вопрос № 2: Есть ли другой подход, который я пропустил?