php foreachでの参照付与&発生する可能性のある問題の使用

1650 ワード

シーン
プロジェクトを书く时、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」の前に付与参照記号「&」があることがわかりました.理由はここにあります.