PHPのOOPにおけるオブジェクトの参照渡し
以下のような User クラスがあるとします:
<?php
class User
{
public $name;
public $age;
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
このクラスのオブジェクトを作成します:
<?php
$user = new User('john', 30);
?>
ここで次の状況を想像してください:変数 $user の値を、
別の変数、例えば $test に代入したいとします。
もしこれがオブジェクトではなく、文字列、数値、配列などの プリミティブ
についての話であれば、変数 $test には変数 $user の値のコピーが入ります。
これは、その後いずれかの変数を変更しても、 もう一方の変数の値は変わらないことを意味します。例を見てみましょう:
<?php
$user = 1;
$test = $user; // 変数 $test には 1 が入る
$test = 2; // 変数 $test は 2 になるが、$user は依然として 1 のまま
?>
オブジェクトの場合は異なります。別の変数に代入する際、 オブジェクトはコピーされず、参照によって渡されます。 つまり、これら両方の変数は同じ1つのオブジェクトを値として持つことになります。 これは重要な結果をもたらします:ある変数を使ってオブジェクトのプロパティを変更すると、 もう一方の変数にも同じ変更が反映されます。
実際に見てみましょう。 ユーザーのオブジェクトを作成します:
<?php
$user = new User('john', 30);
?>
このオブジェクトを別の変数に代入します:
<?php
$test = $user;
?>
変数 $test の name プロパティを変更します。
<?php
$test->name = 'eric';
?>
共通のオブジェクトが変更されたことを確認しましょう。
変数 $user から name プロパティを出力します:
<?php
echo $user->name; // 'eric' と出力されます!
?>
以下のプロパティを持つ Product クラスを作成してください:name,
price。
Product クラスのオブジェクトを作成し、
変数 $product1 に代入してください。
変数 $product1 の値を変数 $product2 に代入してください。
両方の変数が同じオブジェクトを参照していることを確認してください。