オブジェクト変数の参照渡しとは、あるオブジェクト変数を、他のオブジェクト変数から参照すること。一方のオブジェクト変数は、もう一方のオブジェクト変数の、別名(エイリアス)となる。
オブジェクト変数Aを、オブジェクト変数Bから参照するには、オブジェクト変数Aの前に&
を付け、参照渡しで、オブジェクト変数Bへ代入する。その後、オブジェクト変数Aを再定義すると、オブジェクト変数Bも再定義される。オブジェクト変数Bを再定義すると、オブジェクト変数Aも再定義される。つまり、どちらか一方のオブジェクト変数を再定義すると、もう一方のオブジェクト変数を再定義する。「一方のオブジェクト変数は、もう一方のオブジェクト変数の、別名(エイリアス)」とも言える。
どちらか一方のオブジェクト変数を再定義しても、もう一方のオブジェクト変数を再定義させたくないときは、オブジェクト変数の値渡しを使う。
参照渡しで代入
class sampleClassA
{
public $property = "sampleClassAのプロパティ";
function sampleMethod() {
return "sampleClassAのメソッド";
}
}
$varA = new sampleClassA();
$varB = &$varA; // 参照渡し
{
public $property = "sampleClassAのプロパティ";
function sampleMethod() {
return "sampleClassAのメソッド";
}
}
$varA = new sampleClassA();
$varB = &$varA; // 参照渡し
インスタンスを作り、変数$varA
に代入。変数$varB
に、変数$varA
を参照渡しで代入。
サンプル
<?php
class sampleClassA
{
public $property = "sampleClassAのプロパティ";
function sampleMethod() {
return "sampleClassAのメソッド";
}
}
class sampleClassB
{
public $property = "sampleClassBのプロパティ";
function sampleMethod() {
return "sampleClassBのメソッド";
}
}
class sampleClassC
{
public $property = "sampleClassCのプロパティ";
function sampleMethod() {
return "sampleClassCのメソッド";
}
}
$objA = new sampleClassA();
$objB = clone $objA; // 値渡し
$objC = &$objA; // 参照渡し
echo '<p>$objAのプロパティ: ' . $objA->property . '</p>';
echo '<p>$objB(値渡し)のプロパティ: ' . $objB->property . '</p>';
echo '<p>$objC(参照渡し)のプロパティ: ' . $objC->property . '</p>';
echo '<p>$objAのメソッド: ' . $objA->sampleMethod() . '</p>';
echo '<p>$objB(値渡し)のメソッド: ' . $objB->sampleMethod() . '</p>';
echo '<p>$objC(参照渡し)のメソッド: ' . $objC->sampleMethod() . '</p>';
$objA = new sampleClassB(); // $objAを再定義すると、参照渡しで代入した$objCも再定義されることに注目
echo '<br />';
echo '<p>【$objAを再定義すると、参照渡しで代入した$objCも再定義されることに注目】</p>';
echo '<p>$objAのプロパティ: ' . $objA->property . '</p>';
echo '<p>$objB(値渡し)のプロパティ: ' . $objB->property . '</p>';
echo '<p>$objC(参照渡し)のプロパティ: ' . $objC->property . '</p>';
echo '<p>$objAのメソッド: ' . $objA->sampleMethod() . '</p>';
echo '<p>$objB(値渡し)のメソッド: ' . $objB->sampleMethod() . '</p>';
echo '<p>$objC(参照渡し)のメソッド: ' . $objC->sampleMethod() . '</p>';
$objC = new sampleClassC(); // 参照渡しで代入した$objCを再定義すると、$objAも再定義されることに注目
echo '<br />';
echo '<p>【参照渡しで代入した$objCを再定義すると、$objAも再定義されることに注目】</p>';
echo '<p>$objAのプロパティ: ' . $objA->property . '</p>';
echo '<p>$objB(値渡し)のプロパティ: ' . $objB->property . '</p>';
echo '<p>$objC(参照渡し)のプロパティ: ' . $objC->property . '</p>';
echo '<p>$objAのメソッド: ' . $objA->sampleMethod() . '</p>';
echo '<p>$objB(値渡し)のメソッド: ' . $objB->sampleMethod() . '</p>';
echo '<p>$objC(参照渡し)のメソッド: ' . $objC->sampleMethod() . '</p>';
?>
class sampleClassA
{
public $property = "sampleClassAのプロパティ";
function sampleMethod() {
return "sampleClassAのメソッド";
}
}
class sampleClassB
{
public $property = "sampleClassBのプロパティ";
function sampleMethod() {
return "sampleClassBのメソッド";
}
}
class sampleClassC
{
public $property = "sampleClassCのプロパティ";
function sampleMethod() {
return "sampleClassCのメソッド";
}
}
$objA = new sampleClassA();
$objB = clone $objA; // 値渡し
$objC = &$objA; // 参照渡し
echo '<p>$objAのプロパティ: ' . $objA->property . '</p>';
echo '<p>$objB(値渡し)のプロパティ: ' . $objB->property . '</p>';
echo '<p>$objC(参照渡し)のプロパティ: ' . $objC->property . '</p>';
echo '<p>$objAのメソッド: ' . $objA->sampleMethod() . '</p>';
echo '<p>$objB(値渡し)のメソッド: ' . $objB->sampleMethod() . '</p>';
echo '<p>$objC(参照渡し)のメソッド: ' . $objC->sampleMethod() . '</p>';
$objA = new sampleClassB(); // $objAを再定義すると、参照渡しで代入した$objCも再定義されることに注目
echo '<br />';
echo '<p>【$objAを再定義すると、参照渡しで代入した$objCも再定義されることに注目】</p>';
echo '<p>$objAのプロパティ: ' . $objA->property . '</p>';
echo '<p>$objB(値渡し)のプロパティ: ' . $objB->property . '</p>';
echo '<p>$objC(参照渡し)のプロパティ: ' . $objC->property . '</p>';
echo '<p>$objAのメソッド: ' . $objA->sampleMethod() . '</p>';
echo '<p>$objB(値渡し)のメソッド: ' . $objB->sampleMethod() . '</p>';
echo '<p>$objC(参照渡し)のメソッド: ' . $objC->sampleMethod() . '</p>';
$objC = new sampleClassC(); // 参照渡しで代入した$objCを再定義すると、$objAも再定義されることに注目
echo '<br />';
echo '<p>【参照渡しで代入した$objCを再定義すると、$objAも再定義されることに注目】</p>';
echo '<p>$objAのプロパティ: ' . $objA->property . '</p>';
echo '<p>$objB(値渡し)のプロパティ: ' . $objB->property . '</p>';
echo '<p>$objC(参照渡し)のプロパティ: ' . $objC->property . '</p>';
echo '<p>$objAのメソッド: ' . $objA->sampleMethod() . '</p>';
echo '<p>$objB(値渡し)のメソッド: ' . $objB->sampleMethod() . '</p>';
echo '<p>$objC(参照渡し)のメソッド: ' . $objC->sampleMethod() . '</p>';
?>
↓↓↓出力結果↓↓↓
$objAのプロパティ: sampleClassAのプロパティ
$objB(値渡し)のプロパティ: sampleClassAのプロパティ
$objC(参照渡し)のプロパティ: sampleClassAのプロパティ
$objAのメソッド: sampleClassAのメソッド
$objB(値渡し)のメソッド: sampleClassAのメソッド
$objC(参照渡し)のメソッド: sampleClassAのメソッド
【$objAを再定義すると、参照渡しで代入した$objCも再定義されることに注目】
$objAのプロパティ: sampleClassBのプロパティ
$objB(値渡し)のプロパティ: sampleClassAのプロパティ
$objC(参照渡し)のプロパティ: sampleClassBのプロパティ
$objAのメソッド: sampleClassBのメソッド
$objB(値渡し)のメソッド: sampleClassAのメソッド
$objC(参照渡し)のメソッド: sampleClassBのメソッド
【参照渡しで代入した$objCを再定義すると、$objAも再定義されることに注目】
$objAのプロパティ: sampleClassCのプロパティ
$objB(値渡し)のプロパティ: sampleClassAのプロパティ
$objC(参照渡し)のプロパティ: sampleClassCのプロパティ
$objAのメソッド: sampleClassCのメソッド
$objB(値渡し)のメソッド: sampleClassAのメソッド
$objC(参照渡し)のメソッド: sampleClassCのメソッド
$objB(値渡し)のプロパティ: sampleClassAのプロパティ
$objC(参照渡し)のプロパティ: sampleClassAのプロパティ
$objAのメソッド: sampleClassAのメソッド
$objB(値渡し)のメソッド: sampleClassAのメソッド
$objC(参照渡し)のメソッド: sampleClassAのメソッド
【$objAを再定義すると、参照渡しで代入した$objCも再定義されることに注目】
$objAのプロパティ: sampleClassBのプロパティ
$objB(値渡し)のプロパティ: sampleClassAのプロパティ
$objC(参照渡し)のプロパティ: sampleClassBのプロパティ
$objAのメソッド: sampleClassBのメソッド
$objB(値渡し)のメソッド: sampleClassAのメソッド
$objC(参照渡し)のメソッド: sampleClassBのメソッド
【参照渡しで代入した$objCを再定義すると、$objAも再定義されることに注目】
$objAのプロパティ: sampleClassCのプロパティ
$objB(値渡し)のプロパティ: sampleClassAのプロパティ
$objC(参照渡し)のプロパティ: sampleClassCのプロパティ
$objAのメソッド: sampleClassCのメソッド
$objB(値渡し)のメソッド: sampleClassAのメソッド
$objC(参照渡し)のメソッド: sampleClassCのメソッド