2012-05-31 69 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