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

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

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; 


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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩欧美一区二区三区免费观看 | 成年人福利视频 | sxx免费看视频在线播放 | 果冻传媒九一制片厂网站 | 男人影院在线观看 | 欧美老骚| 美女狂揉尿口揉到失禁 | 国产私拍精品88福利视频 | 饭冈加奈子在线播放观看 | 农村妇女野外性生话免费视频 | 双性少爷受糙汉攻h | 日韩国产成人精品视频人 | 亚洲AV无码国产精品色午夜情 | 免费亚洲一区 | 四虎4hu新地址入口 四虎1515h永久 | 古代翁熄系小说辣文 | 色依依视频视频在线观看 | 韩国三级理韩国三级理人伦 | wwwav在线| 日韩免费视频播播 | 亚洲视屏在线观看 | 成年人视频在线免费看 | 草草草视频| 大乳孕妇一级毛片 | 欧美三级小说 | 日韩一| 久久亚洲网站 | 色先锋影音先锋 | 欧美精选视频 | 亚洲精品免费在线观看 | 互换身体全集免费观看 | 单亲乱l仑在线观看免费观看 | 日本一区二区三区国产 | 国产精品手机视频一区二区 | 国产区1| 国产这里有精品 | 青青草色 | 国产一级持黄大片99久久 | 波多洁野衣一二区三区 | 韩国激情网 | 亚洲国产精品无码中文字幕 |