参照の基本
まず参照による代入について見てみます。
$num1 = 100;
$num2 =& $num1; //参照代入演算子で渡す
$num3 = $num1; //値そのものを渡す
上のコードでは$num2には参照代入演算子で渡しておりますので$num1と$num2は同じメモリ領域を指し示すようになるので、どちらか一方に値を代入するともう一方の値も変わります。$num3には$num1の値そのものがコピーされるだけなので$num3の値を変えても$num1には反映されません。
インスタンスの参照
$obj1 = new Sample();
$obj2 = $obj1;
$obj3 =& $obj1;
1行目ではSampleをインスタンス化して、参照を$obj1に代入しています。このときに変数$obj1のメモリ領域にインスタンスの参照情報が格納されます。
2行目で$obj1を$obj2に代入して、$obj1が保持しているインスタンスの参照が代入されます。参照しているインスタンスが同じになります。
3行目はどうなるでしょうか。$obj1の参照が代入されています。$obj3は$obj1を参照し、$obj1が参照しているインスタンスを参照します。
結果的には3つの変数は同じインスタンスを参照しますが、$obj2と$obj3は保持する値が異なるようになります。ですので、インスタンスの参照は=&ではなく=で代入します。
cloneを使ってインスタンスのコピーを代入する
=でインスタンスの参照を代入することが分かりましたが、同じ内容だけど別のインスタンスを用意したい場合もあります。そんなときに使うのがcloneで、インスタンスが保持するプロパティがコピーされます。
<?php
class User{
public $name;
public $age;
}
?>
//html略
<?php
require_once 'user.php';
$user1 = new User();
$user1->name = '佐藤';
$user1->age = 20;
$user2 = clone $user1; //cloneで$user1のコピーを代入。
$user2->name = '鈴木';
$user2->age = '30';
print_r($user1);
print '<br>';
print_r($user2);
?>
上のコードを表示してみるとそれぞれ違う値が格納されていることが分かりますので試してみてください。
コメント