オブジェクト変数の参照渡し

オブジェクト変数の参照渡しとは、あるオブジェクト変数を、他のオブジェクト変数から参照すること。一方のオブジェクト変数は、もう一方のオブジェクト変数の、別名(エイリアス)となる。

オブジェクト変数Aを、オブジェクト変数Bから参照するには、オブジェクト変数Aの前に&を付け、参照渡しで、オブジェクト変数Bへ代入する。その後、オブジェクト変数Aを再定義すると、オブジェクト変数Bも再定義される。オブジェクト変数Bを再定義すると、オブジェクト変数Aも再定義される。つまり、どちらか一方のオブジェクト変数を再定義すると、もう一方のオブジェクト変数を再定義する。「一方のオブジェクト変数は、もう一方のオブジェクト変数の、別名(エイリアス)」とも言える。

どちらか一方のオブジェクト変数を再定義しても、もう一方のオブジェクト変数を再定義させたくないときは、オブジェクト変数の値渡しを使う。

参照渡しで代入

class sampleClassA
{
    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>';
?>

↓↓↓出力結果↓↓↓

$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のメソッド

スポンサード リンク

カテゴリー: PHP, オブジェクト指向プログラミング, 変数 タグ: パーマリンク