01:06カテゴリ:PHPer上級者になるために知っておきたいことさて。コードを伴わせつつ見ていきましょう。++;var_dump($a);var_dump($b);これを、少しだけ、変えてみます。++;var_dump($a);var_dump($b);$bの値を変えたはずなのに$aも変化してしまいます。おおざっぱに、これが「リファレンス渡し」の理解のベースになる、「参照による代入」となります。...この話をすると、他言語...特にC言語とかC++とかをやっている人達のイメージ的には「ようはポインタだろ?」とか思う訳なのですが、結論からいうと「言語の、変数管理のレイヤーレベルで、全然違います」ってのが答えになります。悲劇が待っておりますので。本稿では、その悲劇を、全力で食い止めるべく、努力をしてみたいと思います。顕著なのがC言語なので、少しだけC言語のお話を交ぜていきますが。イメージ的に、似たようなコードを書いて、その違いについて説明をしていきたいと思います。0;}変数名などを出来るだけ一致させて、比較しやすいように書いてみました。「変数bの値をインクリメント」「変数aを表示」てな事をやっている点において、一緒です。上述の中身は「全く違う処理」をやっているために、これを混ぜると大変に危険でございます。分かりやすい(...と思う)、C言語のほうから見ていきましょう。C言語において、変数は宣言された時点で、どこか(スタック領域)にメモリ空間が確保されます。おいちゃんの現在の環境ですと、変数aは、0xbfafec60という番地のメモリにおかれていました(実行タイミングによって微妙にアドレス番地が変わりますので、参考程度に)。変数bの中にも、同じ値が入っています。...ちなみに「変数b自体」は別のメモリ空間(0xbfafec5c)に確保されておりますが、まぁそれは余談。この辺は、以下のコードを動かして、確認してみてください。0;}結果11bff9fad0bff9fad0bff9faccこの辺りの「ポインタの概念」は、その辺になれていない言語圏の人的には少し難しいところ、とはよく聞きますが。ある程度以上いくと「必要になってくる」ので、理解しておくとよいと思われます。...この感覚のまんまPHPを扱うと、物凄く酷い目にあいます。10;」のタイミングで、そこそこ複雑な処理を、裏側でやっています。先に、C言語でそれっぽく書いてみましょう。10;というPHPコードを、C言語でそれっぽく書いてみます。0;}色々まだ語弊がありますが、大体こんな感じでしょうか。日本語で書いていきましょう。PHPは、変数を「2つのテーブル」で管理します。一つが「変数名を管理するテーブル」で、もう一つが「実際の値を管理するテーブル」です。10;」がどのように扱われているかを、箇条書きにして書いてみましょう。整数10こんな風に動きます。++;」を見ていきましょう。&$a;・とりあえず「$aの参照」を代入するので。整数11って演算が入ります。結果的に「$aも$bも、値はインクリメントされている」訳ですね。「参照による代入」と「普通の代入」の双方を書いておきます。分かりやすい「嘘」を書きます。次稿あたりでその辺も正しますが。各テーブルは、コードが実行された後の状態です。整数11テーブルの値になる理由を、しっかりと「ソースコードの実行順番に、空っぽのテーブルに自分で埋めていく」形で追いかけて頂きつつ。特濃なこのネタは、次回に引っ張って行きたいと思います。...数回程度で落ち着くと思いますので。PHPにおける「参照」という概念について、今しばらくおつきあいいただければ幸いです。