久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

深入理解php中unset()

瀏覽:69日期:2022-09-08 08:20:50
概述

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()是語言結(jié)構(gòu),不是函數(shù),因此不能被函數(shù)變量調(diào)用,具體參照函數(shù)變量。

使用function_exists(’unset’)返回的false,以此證明unset并不是一個函數(shù),所以無法使用$fun=’unset’;$fun()的方式調(diào)用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ù)內(nèi)部可以根據(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ù)內(nèi)一個使用global使其全局化的變量,使用unset進行銷毀,那么只有局部的變量會被銷毀,在調(diào)用環(huán)境的變量將會保留沒有使用unset()銷毀之前的調(diào)用的變量值。

the example:

<?phpfunction 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;

上面的例子會返回如下結(jié)果:

深入理解php中unset()

可以看到函數(shù)內(nèi)echo $foo會得到錯誤提示該變量沒有定義,因為unset將$foo在函數(shù)內(nèi)的局部變量銷毀了。

而外部調(diào)用環(huán)境的$foo仍保留著沒有被unset進行銷毀,上面官方描述上寫了調(diào)用環(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ù)中的全局變量,應(yīng)該使用$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ù)內(nèi)global修飾的變量$var會使其全局化,但和$GLOBALS[’var’]性質(zhì)不同,雖然他們都是使用的外部調(diào)用環(huán)境的$var,但是函數(shù)內(nèi)global $var里保存的只是外部環(huán)境調(diào)用變量$val的一個指針或者同名引用,而$GLOBALS[’var’]是外部調(diào)用環(huán)境$var本身,因此unset在函數(shù)內(nèi)對兩者進行銷毀會產(chǎn)生上面例子的不同的原因,前者銷毀的只是保存同名引用或者指針的變量$var,后者銷毀的是外部調(diào)用變量$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ù)內(nèi)部使用unset()進行銷毀,那么只有函數(shù)內(nèi)部的局部變量被銷毀,而調(diào)用環(huán)境變量仍然會保留unset()之前被調(diào)用的值。

<?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ù)內(nèi)部引用的變量$bar其實保存的是外部環(huán)境變量$bar的指針或者說外部變量$bar的引用,因此unset在函數(shù)內(nèi)部銷毀的并不是外部環(huán)境調(diào)用的變量,因此外部環(huán)境調(diào)用的變量$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ù)內(nèi)部的靜態(tài)變量使用unset(),unset()銷毀掉函數(shù)內(nèi)部的靜態(tài)變量,但是下次調(diào)用會恢復(fù)之前該靜態(tài)變量的值。 為了更明顯,下面的例子進行對比,這里對官方的范例進行了修改對比:

<?php function fun1(){static $count=0;$count++;echo 'before:'.$count.' ';$count=’2’;echo 'after'.$count.' ';}for($i=0;$i<5;$i++){fun1();echo '<br/>';}

output: 

深入理解php中unset()

下面使用unset:

<?php function fun1(){static $count=0;$count++;echo 'before:'.$count.' ';unset($count);$count=’2’;echo 'after'.$count.' ';}for($i=0;$i<5;$i++){fun1();echo '<br/>';}

output: 

深入理解php中unset()

兩個對比可以看出,unset只是將函數(shù)內(nèi)部的靜態(tài)變量進行了銷毀,但沒有銷毀儲存在內(nèi)存里的該靜態(tài)變量的值,因為在函數(shù)內(nèi)部用static聲明的靜態(tài)變量存儲的僅僅是指向內(nèi)存存儲該靜態(tài)變量的一個指針,因此unset()銷毀的時候也僅僅是銷毀了該指針,但存儲在內(nèi)存里的靜態(tài)變量值沒有受到影響,因此再次調(diào)用該函數(shù)的時候,static該變量再次建立了與內(nèi)存中該變量的指針關(guān)系,而上一次調(diào)用時unset()之前的該變量值依舊存在,因此會恢復(fù)該變量上一次的值,因此$count進行了遞增。

以上就是深入理解php中unset()的詳細內(nèi)容,更多關(guān)于php unset()的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 欧美日韩亚洲视频 | 欧美日韩亚洲视频 | 天天澡天天狠天天天做 | 91精品国产91久久久久久 | 91精品免费在线观看 | 在线免费视频成人 | 亚洲精品www久久久久久 | 久久久99精品免费观看 | 欧美激情一区二区三区 | 午夜视频一区 | 中文字幕日韩久久 | 91亚洲国产成人久久精品网站 | 成人免费一区二区三区视频网站 | 狠狠操网站 | 黄色av免费看 | 99国产精品久久久久久久 | www.色综合 | 99热手机在线观看 | 国产高清在线看 | 国产成人av在线播放 | 1区在线 | 国产一区在线观看视频 | 欧洲精品视频在线观看 | 国产福利片在线观看 | 欧美日韩一区二区三区不卡视频 | 国产美女精品 | 国产精品日韩欧美一区二区三区 | 91在线最新| 亚洲欧美中文字幕 | 草草视频网站 | 美女操网站 | 国产成人免费 | 欧美性区| 亚洲在线视频 | 97在线免费观看 | 在线观看国产www | 欧美一区二区三区在线观看视频 | 黄片毛片| 99国产精品视频免费观看一公开 | 久久成人在线视频 | 亚洲第一成人在线视频 |