淺談PHP中關(guān)于foreach使用引用變量的坑
寫PHP好多年,但仍然會(huì)犯低級(jí)錯(cuò)誤,今天遇到個(gè) foreach中引用變量時(shí)的坑,PHP版本為 5.6.12 代碼如下:
<?php $arr = ['a', 'b', 'c', 'd', 'e']; foreach ($arr as $i=>&$a) { $a = $a.'_'. $a; echo $a .'<br>'; } echo '<hr>'; foreach ($arr as $i=>$a) { echo $a .'<br>'; } echo '<hr>'; print_r($arr);
輸出結(jié)果
一開始看到第二個(gè) foreach 輸出的結(jié)果感覺很是莫名其妙,怎么會(huì)輸出兩個(gè) d_d 呢?
仔細(xì)想了想,原來(lái)因?yàn)镻HP foreach 中的 $a 的作用域是整個(gè)函數(shù)的局部變量,在循環(huán)外部仍然有效,而不是被封閉在循環(huán)內(nèi)的,
所以當(dāng)執(zhí)行第二個(gè)foreach 時(shí)的 $a 并不是新的變量,而是仍然指向 $arr 數(shù)組第5個(gè)元素的地址引用,
當(dāng)?shù)诙€(gè) foreach 在循環(huán)時(shí)實(shí)際上是在不停的給 $arr 數(shù)組的第5個(gè)元素賦值,
具體賦值情況,
第一次:a_a 賦值給第5個(gè)元素, 結(jié)果為: [a_a, b_b, c_c, d_d,a_a]
第二次:b_b 賦值給第5個(gè)元素,結(jié)果為: [a_a, b_b, c_c, d_d,b_b]
第三次:c_c 賦值給第5個(gè)元素,結(jié)果為: [a_a, b_b, c_c, d_d,c_c]
第四次:d_d 賦值給第5個(gè)元素,結(jié)果為: [a_a, b_b, c_c, d_d,d_d]
第五次:此時(shí)因?yàn)榈谖鍌€(gè)元素已經(jīng)變成 d_d 又重新把 d_d 賦值給第5個(gè)元素,結(jié)果還是為: [a_a, b_b, c_c, d_d,d_d]
解決辦法:
1.盡量不使用相同的循環(huán)變量名;
2.每次使用完或再次使用前進(jìn)行 unset($a); 處理,解除地址應(yīng)用
還是用上面代碼示例:
$arr = ['a', 'b', 'c', 'd', 'e']; foreach ($arr as $i=>&$a) { $a = $a.'_'. $a; echo $a .'<br>'; } echo '<hr>'; echo $a; echo '<hr>'; // 這里 unset 掉 unset($a); echo $a = 'ccc'; echo '<hr>'; print_r($arr); echo '<hr>'; foreach ($arr as $i=>$a) { echo $a .'<br>'; } echo '<hr>'; print_r($arr);
輸出結(jié)果:
現(xiàn)在就正常了,這些小細(xì)節(jié)一定要注意了
以上就是小編為大家?guī)?lái)的淺談PHP中關(guān)于foreach使用引用變量的坑全部?jī)?nèi)容了,希望大家多多支持腳本之家~
- PHP中函數(shù)內(nèi)引用全局變量的方法
- 淺談PHP變量作用域以及地址引用問(wèn)題
- PHP中變量引用與變量銷毀機(jī)制分析
- PHP變量的定義、可變變量、變量引用、銷毀方法
- 深入理解PHP變量的值類型和引用類型
- php引用地址改變變量值的問(wèn)題
- 一道關(guān)于php變量引用的面試題
- php 變量引用與變量銷毀機(jī)制詳細(xì)介紹
- php中引用&的用法分析【變量引用,函數(shù)引用,對(duì)象引用】
- 淺析PHP原理之變量分離/引用(Variables Separation)
- 詳解PHP變量傳值賦值和引用賦值變量銷毀
- php 多個(gè)變量指向同一個(gè)引用($b = &$a)用法分析
相關(guān)文章
php計(jì)算兩個(gè)日期時(shí)間差(返回年、月、日)
這篇文章主要介紹了php計(jì)算兩個(gè)日期時(shí)間差(返回年、月、日),實(shí)現(xiàn)了類似微博中的多少天、多少月、多少前前功能,需要的朋友可以參考下2014-06-06PHP編寫學(xué)校網(wǎng)站上新生注冊(cè)登陸程序的實(shí)例分享
這篇文章主要介紹了使用PHP編寫學(xué)校網(wǎng)站上新生注冊(cè)登陸程序的實(shí)例分享,只包括簡(jiǎn)單的數(shù)據(jù)庫(kù)信息錄入和查詢等步驟的一些關(guān)鍵點(diǎn),需要的朋友可以參考下2016-03-03CI框架實(shí)現(xiàn)優(yōu)化文件上傳及多文件上傳的方法
這篇文章主要介紹了CI框架實(shí)現(xiàn)優(yōu)化文件上傳及多文件上傳的方法,結(jié)合實(shí)例形式詳細(xì)分析了CI框架優(yōu)化文件上傳及多文件上傳的實(shí)現(xiàn)思路與具體操作步驟,需要的朋友可以參考下2017-01-01php調(diào)用dll的實(shí)例操作動(dòng)畫與代碼分享
這是我錄制的一個(gè)gif操作動(dòng)畫,圖片比較大,如果大家在線看圖感覺不流暢的話可以把圖片保存到本機(jī)再看2012-08-08PHP將字符串首字母大小寫轉(zhuǎn)換的實(shí)例
下面小編就為大家?guī)?lái)一篇PHP將字符串首字母大小寫轉(zhuǎn)換的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01PHP使用Memcache時(shí)模擬命名空間及緩存失效問(wèn)題的解決
這篇文章主要介紹了PHP使用Memcache時(shí)模擬命名空間及緩存失效問(wèn)題的解決,這里談到的緩存失效主要針對(duì)高并發(fā)場(chǎng)景下取不到緩存的情況,需要的朋友可以參考下2016-02-02