21

シナリオ:データベースから電子メールテンプレートをフェッチし、受信者のリストをループして、それぞれの電子メールをパーソナライズします。

私のメールテンプレートはネストされたオブジェクトとして返されます。次のようになります。

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))でこれを回避する方法について読んだことがありますが、読んだすべてのことから、これはパフォーマンスに大きな打撃を与えると言われています。

それで、2つは最終的に私の2つの質問に行き着きます:

  1. unserialize(serialize($ obj))はここで合理的な解決策ですか?
  2. それとも私はこのすべてを間違っているのでしょうか?その電子メールオブジェクトのパーソナライズされたコピーを生成する別の方法はありますか?
4

2 に答える 2

29

__clone()メールクラスにメソッドを追加できます。このクラスのインスタンスが clone() によって複製されると、自動的に呼び出されます。この方法では、テンプレートを手動で追加できます。

例:

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

.

unserialize(serialize($object)); // would be another solution...
于 2012-05-31T10:33:37.677 に答える
15

別のより一般的で強力なソリューション: MyCLabs\DeepCopy

オーバーロードする必要なくディープ コピーを作成するのに役立ちます__clone(多数の異なるオブジェクトがある場合、これは多くの作業になる可能性があります)。

于 2014-06-04T09:53:32.203 に答える