オブジェクトの値渡しとは、あるオブジェクト変数の値を、他のオブジェクト変数に代入すること。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; // 値渡し
{
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>';
?>
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のメソッド
$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のメソッド