自 PHP 4 起,unset() 不再是函數,而是語言結構,因此沒有回傳值,不可用於條件判斷。
<?php
function destroy_foo() {
global $foo;
unset($foo); // 僅銷毀區域參考
}
$foo = 'bar';
destroy_foo();
echo $foo; // 輸出:bar
?>
原因:global $foo 建立的是區域參考,unset() 僅移除該參考,不影響全域變數本體。
<?php
function foo() {
unset($GLOBALS['bar']); // 直接操作全域符號表
}
$bar = "something";
foo();
var_dump($bar); // NULL
?>
<?php
$test = str_repeat("1", 256);
$s = memory_get_usage();
unset($test);
$e = memory_get_usage();
echo '釋放記憶體: ' . ($s - $e); // 輸出 272
?>
若字串長度 255,釋放量為 0。
<?php
$test = str_repeat("1", 256);
$p = &$test;
unset($test);
echo $p; // 仍輸出 256 個 1,記憶體未釋放
?>
<?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();
unset($p);
unset($test); // 順序不影響結果
$e = memory_get_usage();
echo '釋放記憶體: ' . ($s - $e); // 272
?>
$var = null 釋放記憶體&$var)