[ PHP ] クラスのディープコピー(オブジェクト変数の参照コピーを回避する)

Pocket

ここでは、PHP のクラスのコピーを行うサンプルプログラムを掲載しています。なお、関連リンク内のコメント内に、有用なサンプルが投稿されていましたので、その紹介です。

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

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *