PHP unset()函式銷燬變數
阿新 • • 發佈:2019-02-15
PHP unset()函式是用來銷燬變數的,但很多時候,這個函式只把變數給銷燬了,記憶體中存放的該變數的值仍然沒有銷燬,也就是沒能達到我們想要的釋放記憶體的效果。這裡我建議大家用 $變數=null 的方法來釋放其記憶體。原因看了下面的就知道了。
以下是關於PHP unset()函式的幾點要點:(以下均在windows環境下測試,php 2.5.9)
1. 該函式只有在變數值所佔空間超過256位元組長的時候才會釋放記憶體
2. 只有當指向該值的所有變數(比如有引用變數指向該值)都被銷燬後,地址才會被釋放(也要執行1的判斷)
下面給出例子程式碼論證:
- < ?php
- $test=str_repeat
- $s = memory_get_usage();
- //改函式用來檢視當前所用記憶體
- unset($test);
- $e = memory_get_usage();
- echo ' 釋放記憶體: '.($s-$e);
- //輸出為272,但如果上面test變數改為
$test=str_repeat("1",255),輸出則為0 - ?>
至於為什麼是272而不是256,就不是很清楚了,不知道內部是怎麼處理的。
- < ?php
- $test = str_repeat("1",256);
- $p = &$test;
- unset($test);
- echo $p;
- //輸出為256個1。如果上面改為unset($p)
,更不行了,echo $test 直接顯示為256個1 - ?>
也就是說記憶體中賦給$a的值仍然存在。可見unset()並沒達到釋放記憶體的效果。
但如果在上述程式碼中加入$test=null,或者再加一個unset($p),就能達到釋放記憶體效果了,PHP unset()函式測試程式碼如下:
變數賦值為null方法:
- < ?php
- $test = str_repeat("1",256);
- $p = &$test;
- $s = memory_get_usage();
- $test = null;
- unset($test);
- $e = memory_get_usage();
- echo ' 釋放記憶體: '.($s-$e);
- //輸出為272
- var_dump($p); //輸出為NULL
- ?>
將指向該地址中值的變數全部銷燬的方法:
- < ?php
- $test = str_repeat("1",256);
- $p = &$test;
- $s = memory_get_usage();
- //注意,以下2個unset()順序對調沒
有關係,不影響結果 - unset($p);
- unset($test);
- $e = memory_get_usage();
- echo ' 釋放記憶體: '.($s-$e); //輸出為272
- ?>
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 的內容。