[PHP - 雷] foreach 與 reference 的雷 
                                                    
                        
                    
                    
  
                    
                    前言
前陣子公司定期技術研討會時,有人提出了一個問題。
$arr = [1, 2, 3]; 
foreach ($arr as &$a) {}
foreach ($arr as $a) {}
var_dump($arr); 考慮以上程式碼執行結果,試問陣列 $arr 在執行結束後的值會是如何?
註:執行環境 PHP 7.1 without swoole
結果:$arr 的值為 [1, 2, 2]
緣由
在 PHP 中,foreach 結束後,迴圈中的索引值(index)及內容(value)並不會被消滅。
$a = [1, 2, 3]; 
foreach ($a as $v) {}
var_dump($v); // int(3)
foreach ($a as $k => $value) {}
var_dump($k, $value); // int(2), int(3)同理,foreach ($a as &$v) {} 時,在迴圈結束後 $v 值不會被消滅,其值仍是參考於(referenced by)陣列中的最後一個值,執行範例如下:
$a = [1, 2, 3]; 
foreach ($a as &$v) {}
var_dump($a); 
/*
array(3) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  &int(3)
}
*/如果在迴圈結束後變更 $v 值,則陣列中的最後一個值也會一併被變更。
解決方法
在使用 foreach ($a as &$v) {} 這類寫法後,應手動 unset($v) 以避免潛在問題發生。
$a = [1, 2, 3];
foreach ($a as &$v) {
    // do something... 
}
unset($v);參考資料
http://php.net/manual/en/control-structure...
在 Warning 中有明確指出此問題。
本作品采用《CC 协议》,转载必须注明作者和本文链接
 
           ChiVincent 的个人博客
 ChiVincent 的个人博客
         
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
             
                     
                     
             
             
             
             
             
             
           
           关于 LearnKu
                关于 LearnKu
               
                     
                     
                     粤公网安备 44030502004330号
 粤公网安备 44030502004330号 
 
推荐文章: