オブジェクト変数の値渡し

オブジェクトの値渡しとは、あるオブジェクト変数の値を、他のオブジェクト変数に代入すること。2つのオブジェクト変数は、別々のオブジェクト変数となる。

オブジェクト変数Aの値を、オブジェクト変数Bに代入するには、オブジェクト変数Aの前にcloneを付け、値渡しで、オブジェクト変数Bへ代入する。その後、オブジェクト変数Aを再定義しても、オブジェクト変数Bは再定義されない。オブジェクト変数Bを再定義しても、オブジェクト変数Aは再定義されない。

どちらか一方のオブジェクト変数を再定義すると、もう一方のオブジェクト変数を再定義するようにするには、オブジェクト変数の参照渡しを使う。

値渡しで代入

class sampleClassA
{
    public $property = "sampleClassAのプロパティ";
    function sampleMethod() {
        return "sampleClassAのメソッド";
    }
}
$varA = new sampleClassA();
$varB = clone $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を再定義しても、値渡しで代入した$objBは再定義されないことに注目

echo '<br />';
echo '<p>【$objAを再定義しても、値渡しで代入した$objBは再定義されないことに注目】</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>';

$objB = new sampleClassC(); // 値渡しで代入した$objBを再定義しても、$objAは再定義されないことに注目

echo '<br />';
echo '<p>【値渡しで代入した$objBを再定義しても、$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を再定義しても、値渡しで代入した$objBは再定義されないことに注目】
$objAのプロパティ: sampleClassBのプロパティ
$objB(値渡し)のプロパティ: sampleClassAのプロパティ
$objC(参照渡し)のプロパティ: sampleClassBのプロパティ
$objAのメソッド: sampleClassBのメソッド
$objB(値渡し)のメソッド: sampleClassAのメソッド
$objC(参照渡し)のメソッド: sampleClassBのメソッド

【値渡しで代入した$objBを再定義しても、$objAは再定義されないことに注目】
$objAのプロパティ: sampleClassBのプロパティ
$objB(値渡し)のプロパティ: sampleClassCのプロパティ
$objC(参照渡し)のプロパティ: sampleClassBのプロパティ
$objAのメソッド: sampleClassBのメソッド
$objB(値渡し)のメソッド: sampleClassCのメソッド
$objC(参照渡し)のメソッド: sampleClassBのメソッド

スポンサード リンク

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