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()函數論證完畢。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章