Глубокий клон PHP

Сценарий: выбор шаблона электронной почты из базы данных и просмотр списка получателей, персонализация электронной почты для каждого из них.

Мой шаблон электронной почты возвращается как вложенный объект. Это может выглядеть примерно так:

object(stdClass) {
    ["title"] => "Event Notification"
    ["sender"] => "[email protected]"
    ["content"] => object(stdClass) {
        ["salutation"] => "Dear %%firstname%%,"
        ["body"] => "Lorem ipsum %%recipient_email%% etc etc..."
    }
}

Затем я прохожу через получателей, передавая этот объект электронной почты функции персонализации():

foreach( $recipients as $recipient ){
    $email_body = personalise( $email, $recipient );
    //send_email();
}

Проблема, конечно, в том, что мне нужно передать объект электронной почты по ссылке, чтобы он заменил теги персонализации, но если я это сделаю, исходный объект будет изменен и больше не будет содержать теги персонализации.

Как я понимаю, клон мне не поможет, потому что он создаст только мелкую копию: объект содержимого внутри объекта электронной почты не будет клонирован.

Я читал о том, чтобы обойти это с помощью unserialize (serialize ($ obj)), но все, что я прочитал, говорит, что это большой успех.

Итак, два, наконец, доберутся до двух моих вопросов:

  • Является unserialize (serialize ($ obj)) разумное решение здесь?
  • Или я все это делаю неправильно? Есть ли другой способ, чтобы я может генерировать персонализированные копии этого объекта электронной почты?

Ответ 1

Вы можете добавить метод __clone() в свой класс электронной почты. Это автоматически вызывается, когда экземпляр этого класса клонируется через clone(). В этом методе вы можете вручную добавить шаблон.

Пример:

class email {
    __clone() {
         $this->template = new template();
    }
}

.

unserialize(serialize($object)); // would be another solution...

Ответ 2

Еще одно общее и мощное решение: MyCLabs\DeepCopy.

Это помогает создавать глубокую копию без необходимости перегружать __clone (что может быть большой работой, если у вас много разных объектов).