一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - PHP中使用foreach和引用導致程序BUG的問題介紹

PHP中使用foreach和引用導致程序BUG的問題介紹

2020-01-08 17:27PHP教程網 PHP教程

PHP 引用有些類似 C 語言指針, 但一些重要的特性和 C 語言指針不一樣, 如果不注意, 會導致程序 BUG. foreach 操作的是數組或對象的拷貝, 但 PHP5, 可以使用引用操作對象元素本身

代碼如下:


$a = array(1, 2); 
$b = array(11, 12); 
foreach($a as &$r){ 

foreach($b as $r){ 

echo $a[1]; // 輸出 12 


兩個的循環的本意可能是: 第一個循環需要在循環中修改元素的內容, 所以使用引用; 但第二個循環只是把 $r 當作一個臨時變量. 可是, 為什么 $a[1] 的值發生了改變呢? 

當對 $a 的迭代完成后, $r 是 $a[1] 的引用, 改變 $r 的值, 就是改變 $a[1]. 這時, 你可以會奇怪, 代碼中并沒有修改 $r, 也沒有修改 $a[1] 呀? 

其實, foreach 是操作的是數組的拷貝, 所以, 后一個迭代相當于: 

復制代碼代碼如下:


for($i=0; $i<count($b); $i++){ 
$r = $b[$i]; // 修改了 $r! 相當于 $a[1] = $b[$i]; 


為了避免這種情況, 應該在第一個迭代之后, 執行 

復制代碼代碼如下:


unset($r); 


從當前環境中刪除 $r 這個變量(引用變量). 

即使不是前面的例子, 在第一個迭代之后, 仍然十分可能再執行類似的語句: 

復制代碼代碼如下:


$r = 123; 


循環變量一般是臨時變量, 同一個變量名在代碼不同的地方表示不同的東西, 但變量的作用域又存在于循環之外. 這就是這種作用域規則的壞處, 加上”變量不聲明即使用”的壞外, 再加上變量無類型的壞處. 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美女被草出水 | 国产高清在线观看 | 99精品视频在线观看re | 日本高清中文字幕一区二区三区 | 色婷婷网| 亚洲欧美精品一区天堂久久 | 日韩一级精品视频在线观看 | 国产香蕉国产精品偷在线观看 | 性xxxx欧美高清 | 99精品偷自拍 | 天天综合天天综合色在线 | 成人在线播放视频 | 四虎影院免费在线播放 | 国产1广场舞丰满老女偷 | 国产主播福利在线观看 | 毛片大全免费看 | 国产男女爱视频在线观看 | 国产国拍亚洲精品av | 我与么公激情性完整视频 | 香蕉久久高清国产精品免费 | 国产婷婷综合丁香亚洲欧洲 | 青青青国产精品国产精品美女 | 成人精品免费网站 | 高清国产精品久久久久 | 亚洲精品动漫免费二区 | 千金在线观看 | 国产成人精品高清免费 | 插鸡网站 | 国产成人精品免费午夜 | 欧美在线一级片 | 亚洲天堂影院 | 好男人好资源在线观看 | 青青草原在线 | 国产日韩免费视频 | 国产精品久久久久久久久免费观看 | 亚洲瑟瑟网 | 国产精品在线 | 波多 在线播放 | 99re这里只有精品在线观看 | 欧美亚洲桃花综合 | 成人福利在线播放 |