PHP deep clone object

送分小仙女□ 提交于 2019-11-27 17:30:43

问题


The scenario: fetch an email template from the database, and loop through a list of recipients, personalising the email for each.

My email template is returned as a nested object. It might look a little like this:

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

Then I loop through the recipients, passing this $email object to a personalise() function:

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

The issue, of course, is that I need to pass the $email object by reference in order for it to replace the personalisation tags - but if I do that, the original object is changed and no longer contains the personalisation tags.

As I understand, clone won't help me here, because it'll only create a shallow copy: the content object inside the email object won't be cloned.

I've read about getting round this with unserialize(serialize($obj)) - but everything I've read says this is a big performance hit.

So, two finally get to my two questions:

  1. Is unserialize(serialize($obj)) a reasonable solution here?
  2. Or am I going about this whole thing wrong? Is there a different way that I can generate personalised copies of that email object?

回答1:


You could add a __clone() method to your email class. Which is automatically called when an instance of this class is cloned via clone(). In this method you can then manually add the template.

Example:

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

.

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



回答2:


Another more generic and powerful solution: MyCLabs\DeepCopy.

It helps creating deep copy without having to overload __clone (which can be a lot of work if you have a lot of different objects).



来源:https://stackoverflow.com/questions/10831798/php-deep-clone-object

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!