如何正確使用PHP 引用

2021-09-25 03:48:57 字數 2791 閱讀 5204

角色: 姓名:王笨笨 愛稱:狗蛋兒

生澀的概念:引用就是別名,多個名字指向同乙個變數內容,沒有重複冗餘的記憶體開銷。

$a = 'runbaby';

$b = &$a;

var_dump($a,$b);

/* * string(7) "runbaby"

* string(7) "runbaby"

*/

bug:因為我們錯誤使用,導致錯誤。我們的工作是什麼:寫bug,找bug,改bug

無限迴圈···

背景:

php一般是web服務,在請求結束後會釋放所有的資源,所以phper一般不用關心記憶體的釋放。但是必須要重視,鳥哥說過:請手動釋放你的資源(please release resources manually)

鳥哥語錄:如果你買了一本php的書, 它告訴你: 「不用在php主動釋放資源, 因為php會幫你釋放」的話, 我建議你, 燒了它.

雖然,在請求結束之後資源就自動釋放了,我們不用太擔心記憶體洩漏。但是在請求中,如果沒有即時釋放引用,那麼引用將一直存在

復現:

<?php 

$array = array(

array(

'id'=>'a',

), array(

'id'=>'b',

), array(

'id'=>'c',

), array(

'id'=>'d',

));foreach ($array as &$value)

}$new_array = array();

foreach ($array as $key =>$value)

var_dump($new_array);die;

預期資料:

列印資訊:

實際資料和預期的有些差別啊 ,為什麼最後乙個重複了,不符合牛頓力學啊

前面實際已經埋下了伏筆,問題出現在:引用沒有釋放。

第乙個遍歷:使用變數 $value

第二個遍歷:使用變數 $value (同乙個變數)

詳解:(心路歷程)

偽**:

$array = array(

array(

'id'=>'a',

), array(

'id'=>'b',

), array(

'id'=>'c',

), array(

'id'=>'d',

),);

foreach ($array as &$value)

}$new_array = array();

foreach ($array as $key =>$value)

仔細觀察列印資料,發現$array[3],一直在變化,a -> b -> c -> c

變、變、變···看我七十二變

分拆步驟

//流程:

//第一遍 $value = $new_array[0] ,但引用未釋放,$value 實際還是 $array[3] , 此時 $array[3] = $new_array[0]

結果:a 、b、c、a

//第二遍 $value = $new_array[1] ,但引用未釋放,$value 實際還是 $array[3] , 此時 $array[3] = $new_array[1]

結果:a 、b、c、b

//第三遍 $value = $new_array[2] ,但引用未釋放,$value 實際還是 $array[3] , 此時 $array[3] = $new_array[2]

結果:a 、b、c、c

//第四遍 $value = $new_array[3] ,但引用未釋放,$value 實際還是 $array[3] , 此時 $array[3] = $new_array[3]

結果:a 、b、c、c

一首小曲總結:

想得卻不可得 你奈人生何

該捨的捨不得 只顧著跟往事瞎扯

等你發現程式是錯了 它早已偷光你的選擇

該來的我不推 該還的還 該給的我給

bug 你別催 調完就ok

及時unset,解除引用操作,避免問題出現,讓我們遠離bug,

讓bug都隨風,都隨風,我心隨你動~~~

unset($value); //捨得
我為人人,人人為我,美美與共,天下大同。

如何正確使用記憶體

如何正確使用記憶體 對於初學者來說,記憶體是個神秘的空間。程式的絕大部分錯誤,也是在於記憶體的使用不當造成的,而且這些錯誤有些都是隱藏很深的。所以,如何掌握記憶體的使用,通曉系統對記憶體的管理手段,將是軟體成功的乙個非常關鍵的因素。首先我們要了解記憶體的分配方式。一般來說,記憶體的分配方式有三種 1...

如何正確使用列舉

列舉型別,對程式設計師來說再熟悉不過了,但是,你確定你在正確得使用它嗎?在用列舉之前,讓我們來區分一下狀態和選項這兩個概念。那麼,我們怎麼使用列舉來定義狀態和選項呢?不好的寫法 你可能經常見到的寫法 define status fail 0 define status success 1 用int變...

如何正確使用AOP

aop也發展了不久了,雖然在工作上也一直在用,不過畢竟沒有深入了解過,停留在概念上的理解,和使用的階段上。這篇主要講講,aop如何正確的使用它。首先需要知道,目前畢竟流行的aop框架,上篇文章也介紹了aop實現的原理,對spring這個大家庭來說,它的aop遠遠沒有這麼簡單。目前使用畢竟多的 幾種方...