2012年3月25日 星期日

PHP在function裡面使用unset注意事項

下面是在function裡修改全域變數值的例子:
function ff()
{
  global $v;
  $v = 2;
}
$v=1;
ff();
var_dump($v);
這個例子會輸出 int(2)




但在function裡unset全域變數:
function ff()
{
  global $v;
  unset($v);
}
$v=1;
ff();
var_dump($v);
這個例子會輸出 int(1)
因為用此寫法,只有在function裡面的區域變數會被銷毀,全域變數則不會被銷毀。
若須在function內真正銷毀全域變數,須使用$GLOBALS,如下
function ff()
{
  unset($GLOBALS["v"]);
}
$v=1;
ff();
var_dump($v);
這個例子會輸出 NULL
表示全域變數被unset了




在function裡修改全域變數的值,再unset全域變數:
function ff()
{
  global $v;
  $v = 2;
  unset($v);
}
$v=1;
ff();
var_dump($v);
這個例子會輸出 int(2)




再來看看function裡static變數的情形:
function ff()
{
 static $v = 0;
 $v++;
 var_dump($v);
}

ff();
ff();
ff();
這個例子會輸出
int(1)
int(2)
int(3)




在function裡unset static變數的情形:
function ff()
{
 static $v = 0;
 $v++;
 var_dump($v);
 unset($v);
 var_dump($v);
}

ff();
ff();
ff();
這個例子會輸出
int(1)
NULL
int(2)
NULL
int(3)
NULL
表示在function裡unset靜態變數後,在之後的程式碼生效了,所以都輸出 NULL,
但效果僅在這一次,再跑下一次時,原先的靜態變數的值,又回復了,好像沒用過unset一樣。



function使用傳遞參考(reference)的情形:
function ff(&$v)
{
  $v=2;
}
$v=1;
ff($v);
var_dump($v);
這個例子會輸出
int(2)



function使用傳遞參考(reference)然後unset變數的情形:
function ff(&$v)
{
  unset($v);
  var_dump($v);
}
$v=1;
ff($v);
var_dump($v);
這個例子會先輸出
NULL
再輸出
int(1)
表示傳參考給function,然後在function內unset該變數,效果也是只有在function內。

沒有留言:

張貼留言