PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPのオブジェクトと参照(リファレンス)の仕組みを徹底解説

はじめに:PHPにおけるオブジェクトの扱い

PHPでは、オブジェクトはデフォルトで参照として扱われます。ここでいう「参照」とはエイリアス(別名)のことで、2つの異なる変数が同じ値に書き込めるようにする仕組みです。

ただし注意が必要なのは、オブジェクト型の変数にはオブジェクトそのものが格納されているわけではないという点です。変数の中身は、実際のオブジェクトを見つけるための「オブジェクト識別子」のみです。オブジェクトが引数として渡されたり、戻り値として返されたり、別の変数に代入されたりする場合、それぞれの変数は互いのエイリアスになるのではなく、同じオブジェクトを指す識別子のコピーを保持することになります。

spl_object_hash()でオブジェクトIDを確認する

PHPにはspl_object_hash()という関数が用意されており、オブジェクトごとに一意なハッシュIDを取得できます。次のコードでは、同じオブジェクトを参照する2つのオブジェクト変数が、まったく同じIDを返すことを確認できます。

<?php
class test1{
    public $name;
}
$obj1=new test1();
echo "ID of obj1: " . spl_object_hash($obj1) . "\n";
$obj2=$obj1;
echo "ID of obj2: " . spl_object_hash($obj2);
?>

実行結果

実行すると、両方の変数のIDが同一であることがわかります。これは、$obj2 が新しいオブジェクトを作成したのではなく、$obj1 と同じオブジェクトを指す識別子を受け取ったためです。

ID of obj1: 000000004355dda6000000006f04b1a7
ID of obj2: 000000004355dda6000000006f04b1a7

明示的な参照(&)を使った場合の動作

変数名の前に & を付けることで、オブジェクト変数への明示的な参照を作成できます。この場合、一方の変数のプロパティに対する変更は、自動的にもう一方の参照変数にも反映されます。

<?php
class test1{
    public $name;
}
$obj1=new test1();
echo "ID of obj1: " . spl_object_hash($obj1) . "\n";
$obj2=&$obj1;
echo "ID of obj2: " . spl_object_hash($obj2) . "\n";
$obj1->name="Amar";
echo "name: " .$obj2->name;
?>

実行結果

$obj1 の name プロパティに値を設定すると、参照元である $obj2 からも同じ値が読み取れることが確認できます。

ID of obj1: 00000000163cf0b8000000003ad0ed93
ID of obj2: 00000000163cf0b8000000003ad0ed93
name: Amar

まとめ

PHPのオブジェクト変数が保持しているのはオブジェクト本体ではなく識別子であり、通常の代入でも同じオブジェクトを共有します。さらに & による明示的な参照を使うと、変数同士がより密接に結び付き、プロパティの変更が即座に相互反映されます。オブジェクトの複製が必要な場合は clone を使うなど、参照とコピーの違いを正しく理解しておくことが重要です。

  1. PHPのmethod_exists()関数とは?メソッドの存在確認方法をわかりやすく解説

    PHPのmethod_exists()関数は、指定したクラスやオブジェクトに特定のメソッドが存在するかどうかをチェックするための組み込み関数です。動的にメソッドを呼び出す前の存在確認など、エラーを防ぎたい場面で非常に役立ちます。基本構文method_exists(object, name_of_method)パラメータobject − チェック対象となるオブジェクトのインスタンス、またはクラス名(文字列)を指定します。name_of_method − 存在を確認したいメソッドの名前を文字列で指定します。戻り値method_name で指定されたメソッドが、対象のオブジェクト(またはクラス)に対

  2. PHPのget_object_vars()関数の使い方を徹底解説

    PHPのget_object_vars()関数は、指定されたオブジェクトが持つプロパティを取得するための関数です。オブジェクト内で定義されているプロパティを、プロパティ名をキーとした連想配列の形式で返します。 構文 get_object_vars(object) パラメータ object − プロパティを取得したいオブジェクトのインスタンスを指定します。 戻り値 get_object_vars()関数は、指定されたオブジェクトの定義済みプロパティを連想配列として返します。まだ値が代入されていないプロパティについては、NULLが返されます。 なお、この関数をクラスの外部から呼び出した場合、取