リファレンスとは?
状態:-
閲覧数:5,551
投稿日:2010-04-29
更新日:2016-03-21
同じ変数の内容を異なった名前で コールすること
・シンボルテーブルのエイリアス
※実メモリのアドレスではない
リファレンスの意義
・「一つの共通の値(実体)」を、「複数の異なる変数名」で参照できるようになる
「変数名」と「変数の内容」は異なる
・このため、同じ内容に異なった複数の名前を付与することが可能
「変数の場所」と「変数内容(値)の場所」は異なる
・変数は、変数内容(値)の場所を格納している
「値を変数に格納」という表現は、厳密には誤り
・変数は、「値」ではなく「値へのリファレンス」を保持しているだけ
・「&演算子」を使ってリファレンスをコピーすれば異なる変数から1つの値を参照することが可能
&演算子
・『左辺の変数に右辺の「値」を格納する』という代入演算子に、『左辺の変数に右辺の変数と共通の「リファレンス」をセットする』という機能を持たせたもの
・シンボルテーブルのエイリアス
※実メモリのアドレスではない
リファレンスを使用すると?
リファレンスの意義
・「一つの共通の値(実体)」を、「複数の異なる変数名」で参照できるようになる
大前提となるPHP仕様
「変数名」と「変数の内容」は異なる
・このため、同じ内容に異なった複数の名前を付与することが可能
PHP仕様意訳
「変数の場所」と「変数内容(値)の場所」は異なる
・変数は、変数内容(値)の場所を格納している
「値を変数に格納」という表現は、厳密には誤り
・変数は、「値」ではなく「値へのリファレンス」を保持しているだけ
・「&演算子」を使ってリファレンスをコピーすれば異なる変数から1つの値を参照することが可能
&演算子
・『左辺の変数に右辺の「値」を格納する』という代入演算子に、『左辺の変数に右辺の変数と共通の「リファレンス」をセットする』という機能を持たせたもの
リファレンス基本操作は3通り
3通り
A.リファレンスの代入
B.リファレンス渡し
C.リファレンスを返す
A.リファレンスの代入
2つの変数が同じ内容(同じ場所)を指す
・$a と $b は同じ内容を指す
・$a と $b は完全に 同じ
・$a が $b を 指しているわけではない、その逆でもない
$a =& $b;
B.リファレンス渡し
変数のリファレンス渡し
・関数でローカル変数が作成される
・呼出側の変数が、それと同じ内容への リファレンスとなる
function foo(&$var)
{
$var++;
}
$a=5;
foo($a);
echo $a; //6
C.リファレンスを返す
両方の場所で & を使用する必要がある
・返されたリファレンスを使うには、リファレンスを代入しなければならない
= &
関数 getValue により返された オブジェクトのプロパティ($this->value)に&を付与
・つまり、$myValue = &(foo::$value);
class foo {
public $value = 42;
public function &getValue() {
return $this->value;
}
}
$obj = new foo;
$myValue = &$obj->getValue(); // $myValue は $obj->value へのリファレンス、つまり 42 となります
$obj->value = 2;
echo $myValue; // $obj->value の新しい値である 2 を表示します
リファレンスを返さない通常の例
class foo {
public $value = 42;
public function getValue() {
return $this->value;
}
}
$obj = new foo;
$myValue = $obj->getValue(); // $myValue は $obj->value へのリファレンス、つまり 42 となります
$obj->value = 2;
echo $myValue; //42
PHP5
<リファレンスの詳細>
シンボルテーブルを利用して、「実体(zval No.)」と「変数名」とを連動させること。
※シンボルテーブル - プログラムのソースコード内の各識別子と、それぞれの宣言内容やソース内での見た目(データ型、スコープレベル、位置など)などの情報を結び付けているデータ構造。
※zval - 変数の内部構造。変数名をキーとした連想配列のようなもの。
下記4つの値を保持している。
・type(変数の型)
・value(実際の値)
・is_ref(変数が参照かどうかを示すフラグ)
・refcount(この値を共有しているラベルの数)
※変数名は値が格納されているzvalを探すために使用されるだけで、zvalに付けられたラベルのようなもの
<リファレンスの意義を言い換えると…>
リファレンスの意義とは、
シンボルテーブルを利用して、「実際の値(zval構造体に収納している実体の値)」に、複数の変数名を、割り当てること(実体の別名/alias)により、「一つの共通の値(実体)」を、「複数の異なる変数名」で参照できるようになること。
ちなみに、C言語のポインタとは異なるため、リファレンスを使ってポインタの演算をすることはできない。
また、リファレンスは実メモリのアドレスでもない。
・変数管理の基礎(PHPの参照とは何か)
シンボルテーブルを利用して、「実体(zval No.)」と「変数名」とを連動させること。
※シンボルテーブル - プログラムのソースコード内の各識別子と、それぞれの宣言内容やソース内での見た目(データ型、スコープレベル、位置など)などの情報を結び付けているデータ構造。
※zval - 変数の内部構造。変数名をキーとした連想配列のようなもの。
下記4つの値を保持している。
・type(変数の型)
・value(実際の値)
・is_ref(変数が参照かどうかを示すフラグ)
・refcount(この値を共有しているラベルの数)
※変数名は値が格納されているzvalを探すために使用されるだけで、zvalに付けられたラベルのようなもの
<リファレンスの意義を言い換えると…>
リファレンスの意義とは、
シンボルテーブルを利用して、「実際の値(zval構造体に収納している実体の値)」に、複数の変数名を、割り当てること(実体の別名/alias)により、「一つの共通の値(実体)」を、「複数の異なる変数名」で参照できるようになること。
ちなみに、C言語のポインタとは異なるため、リファレンスを使ってポインタの演算をすることはできない。
また、リファレンスは実メモリのアドレスでもない。
・変数管理の基礎(PHPの参照とは何か)