2012-05-31 72 views
10

方案:从数据库中获取电子邮件模板,并循环访问收件人列表,为每个收件人个性化电子邮件。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(); 
} 

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

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

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

于是,两人终于让我的两个问题:

  1. 是反序列化(连载($ OBJ))一个合理的解决方案吗?
  2. 或者我正在处理这个错误?有没有不同的方式可以让我生成该电子邮件对象的个性化副本?
+0

我发现swiftmailer在做装饰插件(http://swiftmailer.org/docs/plugins.html#decorator-plugin)方面做得很好,再加上它在头;我们得到了非常低的垃圾邮件结果。 – scott

回答

14

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

实施例:

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

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

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

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

+2

这是要走的路,尤其是在使用ORM(即Doctrine2)时。 –

+0

优秀和优雅的解决方案,谢谢 – Ryall