オブジェクトのコピー

オブジェクトのコピー

オブジェクトのコピーは、ディープコピー(値渡し)とシャローコピー(参照渡し)があります。ディープコピーは値を受け渡すため、コピー後に片方の操作を行った場合にもう片方には影響しません。一方シャローコピーは、変数等が同じものを示すため、コピー後に片方に操作を行うともう片方にも連動します。

シャローコピーは変数の代入と同様で、「オブジェクトA = オブジェクトB」のように記述します。ディープコピーは、「オブジェクトA = clone オブジェクトB」と、記述します。

下のような例を実行すると、オブジェクトコピー後の動作$a->add() の与える影響が異なることがわかります。

class Counter {
    private $count = 0;
	public function add() {
	    $this->count++;
	}
	public function show() {
	    return $this->count;
	}
}
$a = new Counter();
$shallow = $a;
$deep = clone $a;
$a->add();
print $shallow->show();
print $deep->show();

※PHP4ではデフォルト(方法を未指定の場合)ではディープコピーとみなされましたが、PHP5ではデフォルトでシャローコピーとみなされます。

なおクラスには、ディープコピー時に実行されるメソッド__cloneを定義することができます。

class Counter {
    (省略)
	function __clone() {
	    $this->count = 0 ;
	}
}

トラックバック&コメント

この記事のトラックバックURL:

まだトラックバック、コメントがありません。

コメントを投稿する

コメントを投稿するためには ログインしてください。


»
«