オブジェクトのコピー
オブジェクトのコピーは、ディープコピー(値渡し)とシャローコピー(参照渡し)があります。ディープコピーは値を受け渡すため、コピー後に片方の操作を行った場合にもう片方には影響しません。一方シャローコピーは、変数等が同じものを示すため、コピー後に片方に操作を行うともう片方にも連動します。
シャローコピーは変数の代入と同様で、「オブジェクト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 ;
}
}
2007年09月12日 コメント&トラックバック(0) | トラックバックURL |
カテゴリ: PHP
トラックバック&コメント
この記事のトラックバックURL:
まだトラックバック、コメントがありません。