Знаешь еще что меня смущает? Это источник всех этих танцев с бубнами. А именно почему ты не сохраняешь по факту модификации объекта? PHP: <?php $obj->a = 1; $obj->b = 2; DB::getInstance()->save($obj); и плевать что кто-то где-то потом выйдет. Есть небольшой смысл в этих плясках на случай фатальных ошибок. На этот случай вот мусолили http://www.php.ru/forum/viewtopic.php?t=22992 Но и тут, я бы сбрасывал в файлы, а не в базу... ибо базы к этому моменту может не быть физически
Объект меняется в разных местах. Писать каждый раз в базу негламурно. Отследить когда он в последний раз поменяется сложно. И вообще, хочется автоматизма, ибо много кода. Насчёт register_shutdown_function() - я пробовал вызвать деструкторы, поэтому и не работало. С самописными ф-циями похоже всё будет хорошо. Ещё один вопрос, чисто эстетический. Можно как-то авторегистрацию объектов сделать? Ну чтобы в каждом конструкторе не писать это destruct_stack::add_obj($this). Что-то типа PHP: abstract class destruct_control { function __construct() { destruct_stack::add_obj($this); } abstract public function destruct(); } И чтобы при наследовании само вызывалось?
Вообще-то менять его в разых местах не менее негламурно Если это у тебя происходит с массовыми данными - это ошибка. Если таких объектов 3-4 в процессе жизни приложения... я бы забил на гламур и таки писал бы в базу. А рабочее приложение отпрофилировал по нагрузке. И увидел бы мешает ли данный факт мне spl_autoload_register - поможет для самих классов. А вот для объектов... хм Есть варианты фабрик и локаторов, поищи в гугле описание этих паттернов. Но локаторы я недолюбливаю. Во-первых убивает весь автокомплит в IDE. А во-вторых, типичный звездный объект от которого начинает зависеть все. К фабрикам я потолерантнее отношусь. для объектов с общим родителем возможен еще такой вариант PHP: <?php astract class cparent { function __construct() { stack::add($this); $this->init(); } abstract public function init(); } class cchild extends cparent { /** * этот метод у нас теперь вместо конструктора */ function init() { } }
Их сейчас как раз всего 4 штуки, но потом может стать больше. Вот например 1, он добавляет записи в таблицу, у которой много индексных полей: PHP: <?php class events extends destruct_control { var $id; var $mySql; var $cache = ''; function __construct($id, $mySql) { $this->id = $id; $this->mySql = $mySql; $this->register(); } function destruct() { if($this->cache != '') { $query = 'INSERT INTO chat(source, type, dest, message, time)' . ($this->cache); $this->mySql->query($query); } } function add_event($packet, $type) { if($this->cache == '') { $this->cache .= "VALUES (' ', {$type}, '{$this->id}', '{$packet}', NOW())"; } else { $this->cache .= ",(' ', {$type}, '{$this->id}', '{$packet}', NOW())"; } } } Разделять такую запись на много insert-ов и смешивать их с другими запросами к базе сильно увеличит время выполнения, это понятно даже и без профилинга. У другого объекта ситуация такая: он пишет в базу просто свои поля, но эти поля во время выполнения скрипта могут меняться неоднократно. Писать каждый раз изменения в базу увеличит кол-во запросов в несколько раз. Насчёт авторегистрации значит простых вариантов нету. Ладно, буду так писать. В целом пользуюсь тем что мы тут написали, ещё добавил конечно register_shutdown_function('destruct_stack::exiter');. Впечатления от первого применения приятные. Всем спасибо за помощь, особенно Simpliest.