-
Notifications
You must be signed in to change notification settings - Fork 52
Description
Вот такой код:
<?php
$object1 = SomeDao->getById(1);
$object2 = SomeDao->getById(2);
SomeDao->take($object1->setSomeProp('prop1');
$object2 = SomeDao->getById(2); // Да, мне нужно сделать второй раз getById
SomeDao->take($object1->setSomeProp('prop2');
сохранит в БД только одну первую запись для $object1.
Сделает он это потому, что при первом take, вызывается CommonDaoWorker::uncacheById,
в котором вызывается GenericDAO::uncacheLists. Дальше GenericDAO::dropIdentityMap и в нем есть строчка:
$this->identityMap = array().
Из-за этого, когда мы в следующий раз будем вызывать getById(2), то нам вернется ссылка на объект из кэша(GenericDAO::getById, CommonDaoWorker::getById, BaseDaoWorker::getCachedById) и поэтому, чтобы мы не засетили в него, при попытке take переменная $changed, определенная как
$changed = ($old->$getter() !== $object->$getter()) || ($old->$getter() != $object->$getter());
никогда не будет true, т.к. $old и $object один и тот же объект.
Решается, заменой второй строчки
$object2 = SomeDao->getById(2);
на
$object2 = clone SomeDao->getById(2);
Прокомментируйте пожалуйста, баг ли это и есть ли верное решение.