リファレンス

リファレンス

リファレンスとは?

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


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


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


大前提となるPHP仕様


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


PHP仕様意訳


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

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

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

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

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

 閲覧数:463 投稿日: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

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

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

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

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

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

・type(変数の型)

・value(実際の値)

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

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

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



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

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

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






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

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





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


リファレンス渡し

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



週間人気ページランキング / 3-4 → 3-10
順位 ページタイトル抜粋 アクセス数
1 PHPで定数を定義する方法は2種類ある / 配列定数の定義 5
2 ブラウザを閉じたらセッションデータはどうなるの? | セッション 4
2 curl で Cookie を使用する 4
3 SQLite(エラーメッセージ) カテゴリー 3
3 Fatal error: Call to undefined method MDB2_Error::execute() in ○○ on line △△ | Fatal error(エラーメッセージ) 3
3 PHPにおけるメソッドのオーバーライドについて /「引数の数や型は、親クラスのメソッドと完全に一致していなければなりません。」とは具体的にどういう意味ですか? 3
3 「POSIX正規表現」と「PCRE正規表現」の違い 3
3 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 3
3 session_start() | セッション 3
4 バッファリング | 出力バッファリング制御(関数) 2
4 ブラウザを閉じたらセッションデータはどうなるの? | セッション 2
4 セッション管理が必要な理由は、HTTPプロトコルには状態を保持する機能がないため | セッション 2
4 Fatal error: Uncaught HeadlessChromium\Exception\OperationTimedOut: Operation timed out (3sec) in | Fatal error(エラーメッセージ) 2
4 Fatal error: Access level to ▲::$△ must be protected (as in class ●) or weaker | Fatal error(エラーメッセージ) 2
4 Notice(エラーメッセージ) カテゴリー 2
4 register_shutdown_function | 関数処理 関数 2
5 Fatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] Connection refused | Fatal error(エラーメッセージ) 1
5 コード例 … 「例外処理」はネストすることができる 1
5 親クラスのコンストラクタは自動実行されないから、明示的に呼び出す必要がある 1
5 シリアライズ(シリアル化) | 関数 1
2025/3/11 1:01 更新