1. 程式人生 > >PHP unset()函式銷燬變數

PHP unset()函式銷燬變數

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  
  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);  
  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. ?>

unset() 用於銷燬一個或多個變數。

unset()

PHP unset() 用於銷燬一個或多個變數,沒有返回值

語法:

void unset( mixed var [, mixed var [, ...]] )

例子:

<?php
// 銷燬單個變數
unset ($var);

// 銷燬單個數組元素
unset ($arr['a']);

// 銷燬多個變數
unset ($var1, $var2, $var3);
?>

unset() 靜態變數

嚴格講,使用 unset() 銷燬靜態變數,只是斷開了變數名和變數值之間的引用。

例子:

<?php
function foo() {
    static $b;
    $a++;
    $b++;
    echo "$a---$bn";
    unset($a,$b);
    var_dump($a);
    var_dump($b);
    echo "######################n";
}

foo();
foo();
foo();
?>

執行該例子,輸出:

1---1
NULL
NULL
#######################
1---2
NULL
NULL
#######################
1---3
NULL
NULL
#######################

unset() 全域性變數

同 unset() 靜態變數一樣,如果在函式中 unset() 一個全域性變數,則只是區域性變數被銷燬,而在呼叫環境中的變數將保持呼叫 unset() 之前一樣的值。

試著比較如下兩個例子:

<?php
function destroy_foo() {
    global $foo;
    unset($foo);
}

$foo = 'bar';
destroy_foo();
echo $foo;
?> 

<?php
function destroy_foo() {
    global $foo;
    unset($GLOBALS['foo']);
}

$foo = 'bar';
destroy_foo();
echo $foo;
?>

執行第一個例子會輸出:bar ,而第二個例子則不會有任何輸出。

提示
  • 在很多情況下,可以讓 PHP 自動管理變數而無需考慮 unset() 變數。只有在特定的,需要某個變數必須為空的時候才使用到。如:使用者退出登入時,為了確保資訊的安全性,可以用 unset() 清空 session 的內容。