php foreach 中使用引用不當,撐爆記憶體

來源:互聯網
上載者:User
今天一個同事,寫了一段類似下面的代碼:

$a = array(1, 2, 3);foreach($a as $k => &$v){    $a[] = $v;}

預設的 128M 記憶體直接被撐爆了, 原因很簡單:每迴圈一次,都將 $a 數組增加一個 k-v,導致陷入一個無限迴圈中, 記憶體自然不夠用了。

關鍵不是這裡, 關鍵是將 $k => &$v 改為 $k => $v 後, 這個迴圈又可以正常執行了。
查閱 PHP 手冊中, 有一句:"Note:除非數組是被引用,foreach 所操作的是指定數組的一個拷貝,而不是該數組本身。"
是否因為第二種寫法 的 foreach 操作的是數組 $a 的拷貝,而第一種寫法操作的是 $a 的引用或者其本身?

否則這個邏輯錯誤應該是兩種寫法都會體現出來才對。

回複內容:

今天一個同事,寫了一段類似下面的代碼:

$a = array(1, 2, 3);foreach($a as $k => &$v){    $a[] = $v;}

預設的 128M 記憶體直接被撐爆了, 原因很簡單:每迴圈一次,都將 $a 數組增加一個 k-v,導致陷入一個無限迴圈中, 記憶體自然不夠用了。

關鍵不是這裡, 關鍵是將 $k => &$v 改為 $k => $v 後, 這個迴圈又可以正常執行了。
查閱 PHP 手冊中, 有一句:"Note:除非數組是被引用,foreach 所操作的是指定數組的一個拷貝,而不是該數組本身。"
是否因為第二種寫法 的 foreach 操作的是數組 $a 的拷貝,而第一種寫法操作的是 $a 的引用或者其本身?

否則這個邏輯錯誤應該是兩種寫法都會體現出來才對。

解答

首先,肯定你的回答,原因也跟你說的一樣,php裡引用傳遞和值傳遞的區別。至於調試,我建議使用Xdebug調試一下即可,列印數組的zval結構體,代碼如下:

 &$value) {    $arr[] = $value;    xdebug_debug_zval('arr');    echo "\n";}

可以看到zval的結構體的成員:arr: (refcount=3, isref=1),isref欄位為1說明是arr的引用

新疑問

我本該安心的複習演算法,準備各種校招筆試的,但是無奈測試一下一個元素的數組,代碼:

 &$value) {    $arr[] = $value;    xdebug_debug_zval('arr');    echo "\n";}

這個並沒有像我想得一樣進入死迴圈,考慮是否是foreach的內部實現機製造成的,求解釋!!

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.