#目的
PHPリファレンスを理解する。
#背景
PHPのforeachについての記事を書いたときに、指摘いただいたのですが、リファレンスの意味が全くわからない。
#参考資料
PHPの参照はCのポインタとは別物
【PHP】参照(リファレンス)渡しとは?使い方をわかりやすく説明
#1 リファレンスについて考える?
公式ドキュメントによると、
PHP において、リファレンスとは同じ変数の内容を異なった名前で コールすることを意味します。これは C のポインタとは異なります。 リファレンスを使ってポインタの演算をすることはできませんし、 リファレンスは実メモリのアドレスでもありません。詳細は リファレンスが行わないこと を参照ください。 そうではなく、リファレンスはシンボルテーブルのエイリアスです。 PHP では、変数名と変数の内容は異なっており、 このため、同じ内容は異なった複数の名前を有する事が可能であることに 注意してください。最も良く似ているのは、Unix のファイル名とファイルの 関係です。この場合、変数名はディレクトリエントリ、変数の内容は ファイル自体に対応します。リファレンスは、Unix ファイルシステムの ハードリンクのようなものであると考えられます。
だめだ!全くわかんねー!
次はこれを読んでみます
【PHP】参照(リファレンス)渡しとは?使い方をわかりやすく説明
ちょっとだけわかったかも!
今までの認識だと、関数の引数に変数を入れたら、値が代入されるっていう認識だったけど、関数の引数には変数が入るパターン(参照渡し)と、値が入るパターン(値渡し)があるんだな
<?php
function keisan($a){
$a++;
echo $a;
}
$b=1;
keisan($b);
//2と表示
echo $b;
//1と表示
?>
<?php
function keisan(&$a){
$a++;
echo $a;
}
$b=1;
keisan($b);
//2と表示
echo $b;
//ここでも2と表示される
?>
値渡しは引数に値を入れてるだけで、変数に影響はないから、echo $b
の出力が1
になるけど、
参照渡しは引数に変数を代入してるから、変数にも影響が出て、echo $b
すると、2
になる。
これからは、変数と値を別々に捉えた方が良さそうだ、、
、
理解を深めるために、また
公式ドキュメントを読み返してみた。
PHP において、リファレンスとは同じ変数の内容を異なった名前で コールすることを意味します。
さっき理解した感じで説明すると、
y = 5
とx = 5
が存在した時、x,yを値ではなく、変数として関数の引数に入れてもいいという概念があるって伝えたいのかな。
リファレンスはシンボルテーブルのエイリアスです。
シンボルテーブルとは?エイリアスとは????
調べて見る!!!
PHPのシンボルテーブルというのはC実装のレベルの用語で、その時点で有効な変数テーブルのことを指します。つまり、グローバルスコープならグローバル変数を管理する変数テーブル、関数スコープならローカル変数を管理する変数テーブルの意味になります。
まだわからんねー、テーブルとは??
表のように複数の異なる要素間の対応関係を管理するためのデータ構造や格納領域をテーブルという。この場合は必ずしも2次元の格子状に整理された構造を指すとは限らない。
これはわかりやすい
なんとなーくわかってきた!
要するに、
変数と値の関係性を管理?記録?する奴が存在しているんだな!変数の更新とか、参照渡しとかってこいつが管理してるのかなー
この概念もなんか重要な気がする。
IBMさんの変数テーブル
いつどこで使用するかに応じて、名前は同じでも値はそれぞれ異なる変数を定義することができます。 それには、それぞれ異なる変数テーブル内の同一変数に、それぞれ異なる値を割り当てます。
変数テーブルが複数あるっていう概念。
大事な気がする
次はエイリアスについて調べてみた
あだ名。
急に簡単なものが出てきたなー
minoさん記事から
リファレンスを扱うには&演算子を用います
$a = & $b;
さっきのドキュメントもう一度解釈してみる。
リファレンスはシンボルテーブルのエイリアスです。
ってことは、
リファレンスとは、変数と値の関係性を管理?記録?する奴のあだ名。
って解釈でいいのかこれ、、、、
まぁいいか(諦め)
#まとめ
リファレンスとは、
プログラミング実行する時点で、有効な変数と値の関係性を管理するテーブルのあだ名。
、、、、理解するのに諦めました