概述
unset()經(jīng)常會被用到,用于銷毀指定的變量,但它有自己的行為模式,如果不仔細的話可能會被中文解釋給迷惑:
先來看看官方文檔的說法:
unset —— unset a given variable
void unset (mixed $var [,mixed $...]);
parameters:
var:The variable to be unset. //要unset的變量
...:Another variable ... //其他需要unset的變量
return Values:No value is returned. //unset不返回值
Because this is a language construct and not a function,it cannot be called using variable functions.
//unset()是語言結構,不是函數(shù),因此不能被函數(shù)變量調用,具體參照函數(shù)變量。
使用function_exists('unset')返回的false,以此證明unset并不是一個函數(shù),所以無法使用$fun='unset';$fun()的方式調用unset()
It is possible to unset even object properties visible in current context.
//通用環(huán)境下unset可以銷毀對象或者對象的可見屬性(public)
It is not possible to unset $this inside an object method since PHP5
在php5之前unset無法銷毀對象中的$this方法
when using unset() on inaccessible object properties,the __unset() overloading method will be called,if declare.
當unset()無法銷毀對象中的屬性,例如私有屬性,保護屬性,那么會自動加載對象中的__unset方法。
description:
unset() destroys the specified variables. //unset()銷毀指定的變量
The behavior of unset() inside of a function can vary dependiing on what type of variable you are attempting to destroy.
//unset()的行為在函數(shù)內部可以根據(jù)你所指定銷毀的變量類型變化。
變化情況
情況一:
if a globalized variable is unset() inside of a function,only the local variable is destroyed.The variable in the calling environment will retain the same value as before unset() was called.
如果在函數(shù)內一個使用global使其全局化的變量,使用unset進行銷毀,那么只有局部的變量會被銷毀,在調用環(huán)境的變量將會保留沒有使用unset()銷毀之前的調用的變量值。
the example:
?php
function destroy_foo()
{
global $foo;
unset($foo);
}
$foo = 'bar';
destroy_foo();
echo $foo;
?>
the above example will output:bar
這是官方文檔的例子,可能這樣還是不太明顯,把上面的例子改成下面這樣,一切就很清晰了。
?php
function des(){
global $foo;
$foo='bars';
unset($foo);
echo $foo;
}
$foo='bar';
echo "The globalized variable is unset() inside of a function:";
des();
echo "br/>";
echo "The variable in the calling environment:";
echo $foo;
上面的例子會返回如下結果:
可以看到函數(shù)內echo $foo會得到錯誤提示該變量沒有定義,因為unset將$foo在函數(shù)內的局部變量銷毀了。
而外部調用環(huán)境的$foo仍保留著沒有被unset進行銷毀,上面官方描述上寫了調用環(huán)境的$foo將保留的是在使用unset()前的變量值,因此echo出bars,而不是bar。
to unset() a global variable inside of a function,then use the $GLOBALS array to do so.
如果要用unset()銷毀函數(shù)中的全局變量,應該使用$GLOBALS數(shù)組形式
function destroy_foo(){
unset($GLOBALS['foo']);
}
$foo = 'bar';
destroy_foo();
echo $foo;
the above example whill output: Notice: Undefined variable: foo in ...
延伸:
這里可以明確一點,函數(shù)內global修飾的變量$var會使其全局化,但和$GLOBALS['var']性質不同,雖然他們都是使用的外部調用環(huán)境的$var,但是函數(shù)內global $var里保存的只是外部環(huán)境調用變量$val的一個指針或者同名引用,而$GLOBALS['var']是外部調用環(huán)境$var本身,因此unset在函數(shù)內對兩者進行銷毀會產生上面例子的不同的原因,前者銷毀的只是保存同名引用或者指針的變量$var,后者銷毀的是外部調用變量$var本身。
情況二:
if a variable that is PASSED BY REFERENCE is unset() inside of a function,only the local variable is destroyed.The variable in the calling environment will retain the same value as before unset() was called.
如果一個被引用的函數(shù)在函數(shù)內部使用unset()進行銷毀,那么只有函數(shù)內部的局部變量被銷毀,而調用環(huán)境變量仍然會保留unset()之前被調用的值。
?php
function foo($bar){
unset($bar);
$bar="blah";
}
$bar='something';
echo $bar."\n";
foo($bar);
echo $bar."\n";
The above example will output:something something
這個和上面global其實很相似,函數(shù)內部引用的變量$bar其實保存的是外部環(huán)境變量$bar的指針或者說外部變量$bar的引用,因此unset在函數(shù)內部銷毀的并不是外部環(huán)境調用的變量,因此外部環(huán)境調用的變量$bar還存在。
情況三:
if a static variable is unset() inside of a function,unset() destroys the variable only in the context of the rest of a function.Following calls will restore the previous value of a variable.
如果是函數(shù)內部的靜態(tài)變量使用unset(),unset()銷毀掉函數(shù)內部的靜態(tài)變量,但是下次調用會恢復之前該靜態(tài)變量的值。
為了更明顯,下面的例子進行對比,這里對官方的范例進行了修改對比:
?php
function fun1(){
static $count=0;
$count++;
echo "before:".$count." ";
$count='2';
echo "after".$count." ";
}
for($i=0;$i5;$i++){
fun1();
echo "br/>";
}
output:
下面使用unset:
?php
function fun1(){
static $count=0;
$count++;
echo "before:".$count." ";
unset($count);
$count='2';
echo "after".$count." ";
}
for($i=0;$i5;$i++){
fun1();
echo "br/>";
}
output:
兩個對比可以看出,unset只是將函數(shù)內部的靜態(tài)變量進行了銷毀,但沒有銷毀儲存在內存里的該靜態(tài)變量的值,因為在函數(shù)內部用static聲明的靜態(tài)變量存儲的僅僅是指向內存存儲該靜態(tài)變量的一個指針,因此unset()銷毀的時候也僅僅是銷毀了該指針,但存儲在內存里的靜態(tài)變量值沒有受到影響,因此再次調用該函數(shù)的時候,static該變量再次建立了與內存中該變量的指針關系,而上一次調用時unset()之前的該變量值依舊存在,因此會恢復該變量上一次的值,因此$count進行了遞增。
以上就是深入理解php中unset()的詳細內容,更多關于php unset()的資料請關注腳本之家其它相關文章!
您可能感興趣的文章:- PHP unset函數(shù)原理及使用方法解析
- php中用unset銷毀變量并釋放內存
- 關于php unset對json_encode的影響詳解
- php使用unset()刪除數(shù)組中某個單元(鍵)的方法
- PHP魔術方法__ISSET、__UNSET使用實例
- PHP中isset()和unset()函數(shù)的用法小結
- 解析PHP中的unset究竟會不會釋放內存
- php unset全局變量運用問題的深入解析
- php中is_null,empty,isset,unset 的區(qū)別詳細介紹
- PHP中使用unset銷毀變量并內存釋放問題
- php中session_unset與session_destroy的區(qū)別分析
- PHP中刪除變量時unset()和null的區(qū)別分析