ここでは、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 でも同じようにクラスのディープコピーを実現することができたと記憶しています。「だからどうした?」と言われると返す言葉がござーせん。