PHP深层克隆对象

Win*_*ute 16 php clone object

方案:从数据库中获取电子邮件模板,并循环访问收件人列表,为每个收件人个性化电子邮件.

我的电子邮件模板作为嵌套对象返回.它可能看起来像这样:

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

然后我遍历收件人,将此$ email对象传递给personalize()函数:

foreach( $recipients as $recipient ){
    $email_body = personalise( $email, $recipient );
    //send_email();
}
Run Code Online (Sandbox Code Playgroud)

当然,问题是我需要通过引用传递$ email对象以便它替换个性化标记 - 但是如果我这样做,原始对象就会被更改,不再包含个性化标记.

据我所知,克隆在这里不会帮助我,因为它只会创建一个浅拷贝:电子邮件对象内的内容对象不会被克隆.

我已经读过关于使用unserialize(序列化($ obj))来解决这个问题 - 但是我读过的所有内容都说这是一个很大的性能影响.

所以,两个人最后得到了我的两个问题:

  1. 在这里反序列化(序列化($ obj))是一个合理的解决方案吗?
  2. 或者我是否会错过这一切?是否有不同的方式可以生成该电子邮件对象的个性化副本?

pow*_*tac 24

您可以__clone()在电子邮件类中添加方法.当通过clone()克隆此类的实例时会自动调用.在此方法中,您可以手动添加模板.

例:

class email {
    __clone() {
         $this->template = new template();
    }
}
Run Code Online (Sandbox Code Playgroud)

.

unserialize(serialize($object)); // would be another solution...
Run Code Online (Sandbox Code Playgroud)


Mat*_*oli 13

另一个更通用和强大的解决方案:MyCLabs\DeepCopy.

它有助于创建深层复制而不必重载__clone(如果你有很多不同的对象,这可能是很多工作).

  • 这是要走的路,特别是在使用ORM时(即Doctrine2). (2认同)