unset()詳細測試

unset()在函數體中的特別表現

unset() 在函數中的行爲會依賴於想要銷燬的變量的類型而有所不一樣。 如下部分的原理均未講透。(歡迎補充資料)
  • 若是在函數中 unset() 一個全局變量,則只是局部變量被銷燬,而在調用環境中的變量將保持調用 unset() 以前同樣的值。
<?php
function destroy_foo() {
global $foo;
unset($foo);
}
 
$foo = 'bar';
destroy_foo();
echo $foo; //仍將輸出「bar」
?>
  • 若是在函數中 unset() 一個經過引用傳遞的變量,則只是局部變量被銷燬,而在調用環境中的變量將保持調用 unset() 以前同樣的值。
<?php
function foo(&$bar) {
unset($bar);
$bar = "blah";
}
 
$bar = 'something';
echo "$bar\n"; //輸出「something」
 
foo($bar);
echo "$bar\n"; //foo()中的unset不影響調用環境,所以仍將輸出「something」
?>

  • 若是在函數中 unset() 一個靜態變量,則 unset() 將銷燬此變量及其全部的引用。
<?php
function foo() {
static $a;
$a++;
echo "$a\n";
unset($a);
}
 
foo(); //輸出 1
foo(); //輸出 2
foo(); //輸出 3
?>

  • 若是您想在函數中 unset() 一個全局變量,可以使用 $GLOBALS 數組來實現:
<?php
function foo() {
unset($GLOBALS['bar']);
}
 
$bar = "something";
foo();
?>
注: 因爲這是一個語言結構而非函數,所以它沒法被 變量函數調用。 

(續)
PHP unset()函數是用來銷燬變量的,但不少時候,這個函數只把變量給銷燬了,內存中存放的該變量的值仍然沒有銷燬,也就是沒能達到咱們想要的釋放內存的效果。這裏我建議你們用 $變量=null 的方法來釋放其內存。緣由看了下面的就知道了。

如下是關於PHP unset()函數的幾點要點:(如下均在windows環境下測試,php 2.5.9)

1. 該函數只有在變量值所佔空間超過256字節長的時候纔會釋放內存
2. 只有當指向該值的全部變量(好比有引用變量指向該值)都被銷燬後,地址纔會被釋放(也要執行1的判斷)

下面給出例子代碼論證:

1. < ?php 
2. $test=str_repeat("1",256); //重複一個字符串,返回值爲重複後組成的字符串
3. $s = memory_get_usage();   
4. //該函數用來查看當前所用內存 
5. unset($test); 
6. $e = memory_get_usage(); 
7. echo ' 釋放內存: '.($s-$e);   
8. //輸出爲272,但若是上面test變量改成$test=str_repeat("1",255),輸出則爲0 ,變量值不足256不會釋放內存的
9. ?> 

至於爲何是272而不是256,就不是很清楚了,不知道內部是怎麼處理的。

1. < ?php
2. $test = str_repeat("1",256); 
3. $p = &$test; 
4. unset($test); 
5. echo $p;   
6. //輸出爲256個1。若是上面改成unset($p),更不行了,echo $test 直接顯示爲256個1 
7. ?> 

也就是說內存中賦給$a的值仍然存在。可見unset()並沒達到釋放內存的效果。

但若是在上述代碼中加入$test=null,或者再加一個unset($p),就能達到釋放內存效果了,PHP unset()函數測試代碼以下:

變量賦值爲null方法:

1. < ?php 
2. $test = str_repeat("1",256); 
3. $p = &$test; 
4. $s = memory_get_usage();   
5. $test = null; 
6. unset($test); //試一下將該句與$test=null 調換前後順序,則結果將不相同
7. $e = memory_get_usage(); 
8. echo ' 釋放內存: '.($s-$e); 
9. //輸出爲272 
10. var_dump($p); //輸出爲NULL 
11. ?> 

將指向該地址中值的變量所有銷燬的方法:

1. < ?php 
2. $test = str_repeat("1",256); 
3. $p = &$test; 
4. $s = memory_get_usage();   
5. //注意,如下2個unset()順序對調沒有關係,不影響結果 
6. unset($p); 7. unset($test);   8. $e = memory_get_usage(); 9. echo ' 釋放內存: '.($s-$e); //輸出爲272 10. ?> 到此PHP unset()函數論證完畢。
相關文章
相關標籤/搜索