先日よりPHPを始めました。
超初心者な質問で恐縮ですが、調べても意味がいまいち把握できないので教えてください。
変数の頭に&があった場合ですが、マニュアルんは
$bar = &$foo; // $fooを$barにより参照
との記載があるのですが意味が理解できません。
$list = array(100, 200, 500);
foreach ($list as &$value){
$value *= 1.05;
}
unset($value);
ここでの&$valueはどういった意味になるのでしょうか?
また、最後のunset($value);についてもお願いいたします。
初歩的な内容ですみません。宜しくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
そんな使い方することは一度もないから覚えなくていい。
https://qiita.com/tadsan/items/74f992dcc48216b571bd
自分で&書くのは無名関数(クロージャ)のuseくらいしかない。
正確には違うけど「C言語のポインタ」を理解してないとPHPの参照の意味も理解できない。
ポインタは初心者が一番躓きやすい鬼門なので初心者は避けていい。
ポインタを理解するにはさらに下層の知識が必要。
底がないのに使う場面は少ないので最初から「覚えなくていい」。
投稿2020/03/25 04:03
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/25 04:33
2020/03/25 04:37
0
ベストアンサー
参照渡しとコピーの挙動の理解
まずは参照渡しそのものを把握する必要があるかと思います。
例えば
PHP
1<?php 2 3$a = "test"; 4$b = &$a; 5 6var_dump($a); 7var_dump($b); 8 9$b = "test_2"; 10 11var_dump($a); 12var_dump($b); 13
こんなコードを実行すると
string(4) "test" //$aの内容 string(4) "test" //$bの内容 string(6) "test_2" //$aの内容。($b = "test_2"によって変更されている) string(6) "test_2" //$bの内容
という感じで、$b = "test_2";
によって$a
も変更されていることがわかるかと思います。
リファレンスとは? のサンプルコードを一つづつ実行してみて、内容を把握してみてください。
さっと読むならこちらも分かりやすいです
一方で
PHP
1$a = "test"; 2$b = $a;
として場合は$b
は$a
のコピーであり、その後に$b
を変更しても$a
に影響が出ることはありません。
foreachの挙動の把握
次に、foreach
の挙動を把握する必要があります。
PHP
1 2$arr = [1,2,3]; 3 4foreach($arr as $value){ 5 $value = ""; 6} 7 8var_dump($arr);
とすると
array(3) { [0] => int(1) [1] => int(2) [2] => int(3) }
と表示され、$arr
が変更されていないことが確認できます。
foreachはループ毎にその値をas $value
にコピーする
という挙動をするからです。
上記のforeachを無理やり自力で書くとこんな感じ
PHP
1$list = [1,2,3]; 2 3 4$value = $list[0]; 5$value = ""; 6$value = $list[1]; 7$value = ""; 8$value = $list[2]; 9$value = ""; 10
この場合$value
はコピーですから、変更しても元の配列の値には影響が出ません。
foreachで参照渡しをした場合の挙動
PHPマニュアルでは
ループの中で配列の要素を直接変更したい場合は、 $value の前に & をつけます。こうすると、変数には リファレンス が代入されることになります。
と記述されているのは
デフォルトだとコピーになるが、&をつけると参照渡しになるので、参照元の変数(=配列の要素)に影響を与えることが出来るよ
という感じの意味です。
PHP
1 2$arr = [1,2,3]; 3 4foreach($arr as &$value){ 5 $value = ""; 6} 7 8var_dump($arr); 9
は
PHP
1 2$list = [1,2,3]; 3 4 5$value = &$list[0]; 6$value = ""; 7$value = &$list[1]; 8$value = ""; 9$value = &$list[2]; 10$value = ""; 11 12var_dump($list); 13
と同じことになり、$listの各要素が参照によって上書きされる状態になります。
という感じで、最小限のコードを書いて(殆どはPHPマニュアルのサンプルコードで済みます)挙動を確認してみることをお勧めします。
foreachで参照渡しを使わずに配列の値を書き換える方法
PHP
1 2$arr = [1,2,3]; 3 4foreach($arr as $key => $value){ 5 $arr[$key] = ""; 6} 7
PHPにはブロックスコープが存在しないため、$key
にコピーされたインデックスを元の配列と組み合わせることで、元配列を直接参照することが出来ます。
投稿2020/03/25 04:31
総合スコア18727
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
やり取り見てると「そこをまだ気にするようなレベルではない」のでスルーしていいです。
たぶんどれだけ本質的な説明を受けても理解はできません。
既に出ている「覚えなくていい」という回答が真です。
ちなみに「あえて使わなければいけないような場面は中々ない」です。私もPHP扱ってそれなりに長いですけど業務で出てきたこと、あったかな。そういうものです。
投稿2020/03/25 04:35
総合スコア80875
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/02 04:34
0
↓この場合は$valueは配列の値を直接参照するので$valueの値を変更した場合は元の配列の値も変わります。
PHP
1foreach ($list as &$value){
↓この場合は$valueは配列の値のコピーなので$valueの値を変更しても元の配列の値は変わりません。
PHP
1foreach ($list as $value){
最後のunsetは引数の型によって挙動が変わりますが、基本的には変数を削除するものです。
$valueは今後不要になるので削除しておこうという感じでしょうか。
しかしながらループの外でループ変数にアクセスするのは不具合誘発する可能性が高いので
おすすめしません。
投稿2020/03/25 04:30
総合スコア2480
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/25 04:37
2020/03/25 05:00
0
ちょっと厳密に書くとこう
PHP
1foreach ($list as $num=>&$value){
投稿2020/03/25 03:36
総合スコア116724
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/25 03:38
2020/03/25 04:16
2020/03/25 04:20
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。