PHP 深度克隆对象

2022-08-30 19:45:22

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

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

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

然后,我遍历接收者,将此$email对象传递给 personalise() 函数:

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

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

据我所知,克隆在这里对我没有任何帮助,因为它只会创建一个浅层副本:电子邮件对象内的内容对象不会被克隆。

我已经读过关于用unserialize(serialize($obj))解决这个问题的文章 - 但我读过的所有内容都说这是一个很大的性能打击。

所以,两个人终于回答了我的两个问题:

  1. unserialize(serialize($obj))是一个合理的解决方案吗?
  2. 还是我做错了这整件事?是否有其他方法可以生成该电子邮件对象的个性化副本?

答案 1

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

例:

class Email {
    function __clone() {
        $this->template = new Template();
    }
}

.

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

答案 2

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

它有助于创建深度副本而不必过载(如果您有许多不同的对象,这可能会做很多工作)。__clone


推荐