Сценарий: выберите шаблон электронной почты из базы данных и просмотрите список получателей, персонализируя электронную почту для каждого.
Мой шаблон электронной почты возвращается как вложенный объект. Это может выглядеть примерно так:
object(stdClass) { ["title"] => "Event Notification" ["sender"] => "notifications@mysite.com" ["content"] => object(stdClass) { ["salutation"] => "Dear %%firstname%%," ["body"] => "Lorem ipsum %%recipient_email%% etc etc..." } }
Затем я прохожу через получателей, передавая этот объект электронной почты функции персонализации ():
foreach( $recipients as $recipient ){ $email_body = personalise( $email, $recipient ); //send_email(); }
Проблема, конечно же, в том, что мне нужно передать объект $ email по ссылке, чтобы он заменил теги персонализации, но если я это сделаю, исходный объект будет изменен и больше не будет содержать теги персонализации.
Насколько я понимаю, клон мне не поможет, потому что он создаст только мелкую копию: объект содержимого внутри объекта электронной почты не будет клонирован.
Я читал о том, чтобы обойти это с помощью unserialize (serialize ($ obj)), но все, что я прочитал, говорит, что это большой успех.
Итак, два, наконец, доберутся до двух моих вопросов:
Вы можете добавить метод __clone()
в свой класс электронной почты. Это автоматически вызывается, когда экземпляр этого класса клонируется через clone (). В этом методе вы можете вручную добавить шаблон.
Пример:
class email { __clone() { $this->template = new template(); } }
,
unserialize(serialize($object)); // would be another solution...
Еще одно общее и мощное решение: MyCLabs \ DeepCopy .
Это помогает создавать глубокую копию без необходимости перегружать __clone
(что может быть большой работой, если у вас много разных объектов).