リファレンス

リファレンス

リファレンスとは?

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


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


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


大前提となるPHP仕様


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


PHP仕様意訳


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

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

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

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

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

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

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

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

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

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

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

・type(変数の型)

・value(実際の値)

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

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

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



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

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

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






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

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





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


リファレンス渡し

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



週間人気ページランキング / 5-25 → 5-31
順位 ページタイトル抜粋 アクセス数
1 PHPにおけるメソッドのオーバーライドについて /「引数の数や型は、親クラスのメソッドと完全に一致していなければなりません。」とは具体的にどういう意味ですか? 5
2 http_build_queryとは? / 構文 /パラメータ 4
2 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 4
3 htmlspecialchars / htmlentities / addslashes / mysql_real_escape_string / mysqli_real_escape_string | セキュリティ 3
3 ブラウザを閉じたらセッションデータはどうなるの? | セッション 3
3 インポートするデータを受信できませんでした。ファイル名が送信されていないか、ファイルサイズが PHP の設定で許可された最大値を超えています。FAQ 1.16 をご覧ください | エラーメッセージ 3
4 セッション管理が必要な理由は、HTTPプロトコルには状態を保持する機能がないため | セッション 2
4 $this | クラスとオブジェクト 2
4 Fatal error(エラーメッセージ) カテゴリー 2
4 PHPで定数を定義する方法は2種類ある / 配列定数の定義 2
4 Warning: session_write_close(): Failed to write session data (user) | Warning(エラーメッセージ) 2
4 ( ! ) Warning: Declaration of xxxx should be compatible with | エラーメッセージ 2
4 ( ! ) Fatal error: Uncaught Abraham\TwitterOAuth\TwitterOAuthException: {"errors":[{"code":32,"message":"Could not authenticate you."}]} | Fatal error(エラーメッセージ) 2
4 Fatal error: require_once(): Failed opening required 'PEAR.php' | Fatal error(エラーメッセージ) 2
4 Fatal error: Uncaught Wrench\Exception\HandshakeException: No accept header receieved on handshake response in ★★★ headless-chromium-php/vendor/wrench/wrench/lib/Wrench/Protocol/Protocol.php | エラーメッセージ 2
4 Fatal error: Uncaught Error: Call to a member function modify() on string | Fatal error(エラーメッセージ) 2
4 可変変数 | 変数 2
4 クロージャ | 関数 2
4 Fatal error: Access level to ▲::$△ must be protected (as in class ●) or weaker | Fatal error(エラーメッセージ) 2
5 mixed | 型 1
2025/6/1 1:01 更新