PHP 傳遞使用 foreach引用賦值&問題


樓主在寫項目的時候,由於初涉PHP的賦值引用操作,覺得這個功能非常強大,用時一時爽,沒有深入了解過其中的原理,導致了一些當時覺得不可思議的BUG,廢話不都說,我舉個例子詳細的描述一下這個問題。

代碼:

 

  1.  
    $test= array('a','b','c');
  2.  
     
  3.  
    foreach($test as &$value){
  4.  
    echo $value;
  5.  
    }
  6.  
    echo $value;
  7.  
     
  8.  
    foreach($test as $value){
  9.  
    echo $value;
  10.  
    }
  11.  
    echo $value;

 

 

運行結果:

'a','b','c'

'c'

'a','b','b'

'b'

解釋:

在第一個foreach中,我們使用了賦值引用符號,它的意思是每次遍歷時,$value指向的是$test數組中的對應元素的地址,循環一次時,$value指向的是'a'的地址,第二次循環的時候,$test指向的是第二個元素'b'的地址,第三次循環時,指向的就是'c'的地址。當我們在做第二次遍歷的時候,其實$value變量指向的還是$test的第三個元素即'c'的地址。然后foreach本身的操作是把數組中對應的元素賦值給as后面的變量,所以在第二個foreach中,遍歷第一次的時候,把‘a’賦值給$value指向的地址即['a','b','a'],第二次遍歷的時候,把'b'賦值給$value指向的地址即['a','b','b'],第三次遍歷的時候,就把'b'賦值給$value指向的地址,這也就是為什么輸出結果是['a','b','b']而不是['a','b','c']的原因。

解決方案:

在使用完賦值引用操作符之后,把變量unset掉,上例中加上unset($value)語句,相當於取消$value對該地址的引用,這樣第二次foreach的時候,$value相當於新的變量,不會導致上述問題。這也是一個很好的編程習慣。

實驗:

 

  1.  
    $test= array('a','b','c');
  2.  
     
  3.  
    foreach($test as &$value){
  4.  
    //對$value進行操作
  5.  
    }
  6.  
    var_dump($test);

 

大家如果運行一下的話,會發現瀏覽器打印出來的結構是這樣的:

 

array (size=3)
  0 =>  'a' (length=1)
  1 =>  'b' (length=1)
  2 => & 'c' (length=1)

大家有木有發現,元素'c'的前面有個賦值引用符號’&‘,原因就在這里。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM