ここでは、PHP のクラスのコピーを行うサンプルプログラムを掲載しています。なお、関連リンク内のコメント内に、有用なサンプルが投稿されていましたので、その紹介です。
スポンサーリンク
クラスのディープコピー
__clone キーワードで作成したクラスのクローンは、メンバ変数が int や string 型といったスカラ型であれば期待する通りにコピーされますが、メンバ変数がオブジェクト変数の場合には参照コピーとなります。
従って、オブジェクト変数の場合でも、参照コピーではなくディープコピーを行うためには、処理を記述してあげる必要があります。以下は、上記関連リンク内にあった、有用と思われるサンプルプログラムになります。
/*
* 属性にオブジェクトを持っている場合でも参照コピーではなく
* 実体コピーを行う場合の、__clone() メソッドの実装例
*/
protected function __clone()
{
foreach($this as $key => $val) {
if(is_object($val) || (is_array($val))){
$this->{$key} = unserialize(serialize($val));
}
}
}
サンプルプログラムでは、ディープコピーを、シリアライズとアンシリアライズ(デシリアライズ)関数を使って実現しています。
.Net でも同じようにクラスのディープコピーを実現することができたと記憶しています。「だからどうした?」と言われると返す言葉がござーせん。