Учитывая класс с действительно дорогим кодом, я хочу избежать запуска этого кода при переопределении экземпляра.
Лучше всего объяснить с помощью некоторого псевдокода:
$foo = new Foo('bar');
print $foo->eat_cpu_and_database_resources(); #=> 3.14159
$foo->store_in_cache(); #Uses an existing Memcached and/or caching to store serialized.
#new thread, such as a new HTTP request. Could be days later.
$bar = new Foo('bar');
print $foo->eat_cpu_and_database_resources(); #=> 3.14159
Второй $ bar должен повторно инициализировать ранее созданный экземпляр $ foo. Внутри моего реального класса я делаю несколько вещей на eat_cpu_and_database_resources()
, который называется get_weighted_tags()
: вычислять взвешенное облако тегов из значений в $foo->tags
. $foo->tags()
был заполнен дорогими $foo->add_tag()
звонками. Я хотел бы теперь получать подготовленный и заполненный экземпляр из кэша.
Я попытался просто извлечь из (сериализованного) кэша в __construct () и назначить полученный экземпляр для $this
, что недопустимо в PHP:
function __construct ($id) {
if ($cached = $this->cache_get($id)) {
$this = $cached
}
else {
#initialize normally
}
}
Это правильный путь? Или я должен обрабатывать каждый экземпляр уникальным и вместо этого применять кэширование в методе eat_cpu_and_database_resources()
вместо кэширования всего экземпляра?
Есть ли в PHP встроенный способ восстановления старых экземпляров (в новом потоке)?