php foreachでの参照付与&発生する可能性のある問題の使用
1650 ワード
シーン
プロジェクトを书く时、PHPの賦値引用操作に初めて関わったので、この机能はとても强いと思って、使う时は一时的にさっぱりしていて、その原理を深く理解したことがなくて、いくつかその时不思议なBUGを招いて、くだらないことはすべて言わないで、私は例を挙げて详しくこの问题を说明します.
コード:
結果:
説明:
最初のforeachでは、$valueは$test配列の対応する要素のアドレスを指し、1回のループでは$valueは'a'のアドレスを指し、2回目のループでは$testは2番目の要素'b'のアドレスを指し、3回目のループでは'c'のアドレスを指します.私たちが2回目の遍歴をしたとき、実は$value変数は$testの3番目の要素である'c'のアドレスを指しています.そしてforeach自体の動作は配列中の対応する要素をasの後ろの変数に割り当てるので、2番目のforeachでは、1回目を巡回するときに$valueが指すアドレスである['a','b','a']、2回目を巡回するときに$valueが指すアドレスである['a','b','b']、3回目を巡回するときに、$valueが指すアドレスに'b'を割り当てます.これは、出力結果が['a','b','b']であり、['a','b','c']ではない理由です.
ソリューション:
割り当て参照オペレータを使用した後、変数unsetを削除し、上記の例にunset($value)文を加えると、$valueのアドレスへの参照をキャンセルすることになります.このように2回目のforeachの場合、$valueは新しい変数に相当し、上記の問題は発生しません.これも良いプログラミング習慣です.
実験:
実行してみると、ブラウザから印刷された構造は次のようになっています.
要素「c」の前に付与参照記号「&」があることがわかりました.理由はここにあります.
プロジェクトを书く时、PHPの賦値引用操作に初めて関わったので、この机能はとても强いと思って、使う时は一时的にさっぱりしていて、その原理を深く理解したことがなくて、いくつかその时不思议なBUGを招いて、くだらないことはすべて言わないで、私は例を挙げて详しくこの问题を说明します.
コード:
$test=array('a','b','c');
foreach($test as &$value){
echo $value;
}
echo $value;
foreach($test as $value){
echo $value;
}
echo $value;
結果:
'a','b','c'
'c'
'a','b','b'
'b'
説明:
最初のforeachでは、$valueは$test配列の対応する要素のアドレスを指し、1回のループでは$valueは'a'のアドレスを指し、2回目のループでは$testは2番目の要素'b'のアドレスを指し、3回目のループでは'c'のアドレスを指します.私たちが2回目の遍歴をしたとき、実は$value変数は$testの3番目の要素である'c'のアドレスを指しています.そしてforeach自体の動作は配列中の対応する要素をasの後ろの変数に割り当てるので、2番目のforeachでは、1回目を巡回するときに$valueが指すアドレスである['a','b','a']、2回目を巡回するときに$valueが指すアドレスである['a','b','b']、3回目を巡回するときに、$valueが指すアドレスに'b'を割り当てます.これは、出力結果が['a','b','b']であり、['a','b','c']ではない理由です.
ソリューション:
割り当て参照オペレータを使用した後、変数unsetを削除し、上記の例にunset($value)文を加えると、$valueのアドレスへの参照をキャンセルすることになります.このように2回目のforeachの場合、$valueは新しい変数に相当し、上記の問題は発生しません.これも良いプログラミング習慣です.
実験:
$test=array('a','b','c');
foreach($test as &$value){
// $value
}
var_dump($test);
実行してみると、ブラウザから印刷された構造は次のようになっています.
array (size=3)
0 => string 'a' (length=1)
1 => string 'b' (length=1)
2 => &string 'c' (length=1)
要素「c」の前に付与参照記号「&」があることがわかりました.理由はここにあります.