リファレンス

リファレンス

リファレンスとは?

 状態:-  閲覧数:5,757  投稿日:2010-04-29  更新日:2016-03-21  
同じ変数の内容を異なった名前で コールすること
・シンボルテーブルのエイリアス
※実メモリのアドレスではない


リファレンスを使用すると?


リファレンスの意義
・「一つの共通の値(実体)」を、「複数の異なる変数名」で参照できるようになる


大前提となるPHP仕様


「変数名」と「変数の内容」は異なる
・このため、同じ内容に異なった複数の名前を付与することが可能


PHP仕様意訳


「変数の場所」と「変数内容(値)の場所」は異なる
・変数は、変数内容(値)の場所を格納している

「値を変数に格納」という表現は、厳密には誤り

・変数は、「値」ではなく「値へのリファレンス」を保持しているだけ
・「&演算子」を使ってリファレンスをコピーすれば異なる変数から1つの値を参照することが可能

&演算子
・『左辺の変数に右辺の「値」を格納する』という代入演算子に、『左辺の変数に右辺の変数と共通の「リファレンス」をセットする』という機能を持たせたもの

リファレンス基本操作は3通り

 閲覧数:504 投稿日:2016-03-21 更新日:2016-03-21 

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

 閲覧数:573 投稿日:2016-03-21 更新日:2016-03-21 
<リファレンスの詳細>

シンボルテーブルを利用して、「実体(zval No.)」と「変数名」とを連動させること。

※シンボルテーブル - プログラムのソースコード内の各識別子と、それぞれの宣言内容やソース内での見た目(データ型、スコープレベル、位置など)などの情報を結び付けているデータ構造。

※zval - 変数の内部構造。変数名をキーとした連想配列のようなもの。

下記4つの値を保持している。

・type(変数の型)

・value(実際の値)

・is_ref(変数が参照かどうかを示すフラグ)

・refcount(この値を共有しているラベルの数)

※変数名は値が格納されているzvalを探すために使用されるだけで、zvalに付けられたラベルのようなもの



<リファレンスの意義を言い換えると…>

リファレンスの意義とは、

シンボルテーブルを利用して、「実際の値(zval構造体に収納している実体の値)」に、複数の変数名を、割り当てること(実体の別名/alias)により、「一つの共通の値(実体)」を、「複数の異なる変数名」で参照できるようになること。






ちなみに、C言語のポインタとは異なるため、リファレンスを使ってポインタの演算をすることはできない。

また、リファレンスは実メモリのアドレスでもない。





変数管理の基礎(PHPの参照とは何か)


リファレンス渡し

コメント投稿(ログインが必要)



週間人気ページランキング / 7-31 → 8-6
順位 ページタイトル抜粋 アクセス数
1 ブラウザを閉じたらセッションデータはどうなるの? | セッション 5
2 Fatal error: Uncaught Error: Call to a member function modify() on string | Fatal error(エラーメッセージ) 4
2 PHPで定数を定義する方法は2種類ある / 配列定数の定義 4
2 PHPにおけるメソッドのオーバーライドについて /「引数の数や型は、親クラスのメソッドと完全に一致していなければなりません。」とは具体的にどういう意味ですか? 4
2 ブラウザを閉じたらセッションデータはどうなるの? | セッション 4
3 T_CONSTANT_ENCAPSED_STRING | エラーメッセージ 3
3 「POSIX正規表現」と「PCRE正規表現」の違い 3
3 Fatal error: require_once(): Failed opening required 'PEAR.php' | Fatal error(エラーメッセージ) 3
3 curl で Cookie を使用する 3
3 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 3
3 You currently have Essential access which includes access to Twitter API v2 endpoints only. | Twitter API(エラーメッセージ) 3
3 PHP用語 3
4 Fatal error: Call to undefined method MDB2_Error::execute() in ○○ on line △△ | Fatal error(エラーメッセージ) 2
4 Fatal error: Using $this when not in object context in /○○.php on line △△ | Fatal error(エラーメッセージ) 2
4 ob紛らわしい関数()一覧 | 出力バッファリング制御(関数) 2
4 php-devel とは? 2
4 You currently have Essential access which includes access to Twitter API v2 endpoints only. If you need access to this endpoint, you’ll need to apply for Elevated access via the Developer Portal. | Twitter API(エラーメッセージ) 2
4 ( ! ) Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined | Fatal error(エラーメッセージ) 2
4 session_start() | セッション 2
4 コード例 … 「例外処理」はネストすることができる 2
2025/8/7 1:01 更新