Intereting Posts
Получите средний интервал между двумя датами PHP Проблема mysqli_connect увеличить и уменьшить значение с помощью переключателя Используйте twitter api для входа пользователя из Twitter Неподдерживаемые типы операндов получить строку ошибки сокета при сбое асинхронного подключения Устранение неполадок, связанных с моделью в контроллере laravel Декодирование запутанного исходного кода PHP Ответ PHP-скрипта PHP навсегда Создание одного-много полиморфных отношений с доктриной Magento: установка представления хранилища по умолчанию для групп клиентов Двустороннее шифрование: мне нужно хранить пароли, которые можно получить CURSOR в proc, который только блокирует текущую строку UPDATEd (в то время как UPDATING), и ничего больше для продолжительности? Как скомпилировать кросс-версию PHP-расширений? Удаление значений с более чем двумя десятичными знаками в массиве

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

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

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

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)), но все, что я прочитал, говорит, что это большой успех.

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

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

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

Пример:

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

,

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

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

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