PHP深度克隆对象

标签 php object clone

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

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

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 对象,以便它替换个性化标签 - 但如果我这样做,原始对象将被更改,不再包含个性化标签。

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

我读过有关使用 unserialize(serialize($obj)) 解决此问题的信息 - 但我读过的所有内容都表明这是一个很大的性能损失。

所以,两个终于到了我的两个问题:

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

最佳答案

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

例子:

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

.

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

关于PHP深度克隆对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10831798/

相关文章:

php - 在php中上传文件之前检查图片文件类型和大小

javascript - 如何使用 .reduce() 将数组转换为对象数组

javascript - JavaScript 函数是对象吗?

javascript - 基于两个属性从 JavaScript 中的对象数组中获取唯一数组

java - 标准API中有没有可以深度克隆列表的方法?

jquery - 克隆元素并添加和删除?

JQuery 将类添加到克隆元素

php - fromCharCode 的 PHP 等价物是什么?

java - 使用 volley 库获取具有整数的 json

php - 系统生成的电子邮件退回