リファレンス

リファレンス

リファレンスとは?

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


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


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


大前提となるPHP仕様


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


PHP仕様意訳


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

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

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

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

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

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

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

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

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

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

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

・type(変数の型)

・value(実際の値)

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

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

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



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

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

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






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

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





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


リファレンス渡し

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



週間人気ページランキング / 11-5 → 11-11
順位 ページタイトル抜粋 アクセス数
1 PHPで定数を定義する方法は2種類ある / 配列定数の定義 12
2 Warning: strlen() expects parameter 1 to be string, array given in ○○.php on line △△ | Warning(エラーメッセージ) 4
3 Fatal error: Uncaught Error: Call to a member function modify() on string | Fatal error(エラーメッセージ) 3
3 spliceImageメソッド | Imagickクラス 3
3 PHP用語 3
4 コード例 … 「例外処理」はネストすることができる 2
4 位置を表現するメタキャラクタ(アンカー) 2
4 「POSIX正規表現」と「PCRE正規表現」の違い 2
4 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 2
4 php-devel とは? 2
4 PHPにおけるメソッドのオーバーライドについて /「引数の数や型は、親クラスのメソッドと完全に一致していなければなりません。」とは具体的にどういう意味ですか? 2
4 ( ! ) Fatal error: Uncaught Abraham\TwitterOAuth\TwitterOAuthException: 現在この機能は一時的にご利用いただけません | Fatal error(エラーメッセージ) 2
4 register_shutdown_function | 関数処理 関数 2
4 セッション 2
4 SessionHandler::gc | セッション 2
4 結合時の評価と優先順位 | 演算子 2
5 __get()メソッド | マジックメソッド(クラスとオブジェクト) 1
5 ログイン 1
5 Deprecated: Assigning the return value of new by reference is deprecated | Deprecated(エラーメッセージ) 1
5 foreach文 | 制御構造 1
2025/11/12 1:01 更新