php unset全局變量運(yùn)用問題的深入解析
更新時(shí)間:2013年06月17日 15:04:32 作者:
本篇文章是對(duì)php中的unset全局變量運(yùn)用問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
PHP unset全局變量在實(shí)際使用中只能銷毀局部變量,并不能實(shí)現(xiàn)全局變量的目的。下面我們就來具體解決這一問題。希望對(duì)大家有所幫助。
PHP中語言中有些函數(shù)對(duì)于初學(xué)者來說在字面上是很難理解的,需要在實(shí)際編碼中總結(jié)經(jīng)驗(yàn),來掌握這些知識(shí)。我們今天要為大家介紹的是PHP unset全局變量在使用中遇到的一些問題。
PHP 中有個(gè)釋放變量的語句叫做unset(從PHP4開始unset已經(jīng)不再是一個(gè)函數(shù)了,而是一個(gè)語句),前幾天用unset的時(shí)候出了點(diǎn)問題,于是把 unset問題總結(jié)如下。如果您仔細(xì)閱讀過PHP的手冊(cè),那么就沒必要再看這篇文章了,這篇文章是寫給看手冊(cè)不用心的同學(xué)的。
首先要強(qiáng)調(diào)的一點(diǎn)是PHP unset全局變量在PHP中已經(jīng)不再是一個(gè)函數(shù)了,既然不是函數(shù),那么就沒有了返回值,所以用的時(shí)候不能夠用unset的返回值來做判斷。
其次,在函數(shù)中,PHP unset全局變量只能銷毀局部變量,并不能銷毀全局變量,來看下手冊(cè)的一個(gè)例子
< ?PHP
function destroy_foo() {
global $foo;
unset($foo);
}
$foo = ‘bar';
destroy_foo();
echo $foo;
?>
返回的結(jié)果為
bar
為什么會(huì)這樣呢?原因就是PHP unset全局變量在函數(shù)中只能銷毀局部變量。如果在程序中需要用到銷毀全局變量的應(yīng)該如何做呢?也很簡單,用$GLOBALS數(shù)組來實(shí)現(xiàn)。看下面的例子:
< ?PHP
function foo() {
unset($GLOBALS['bar']);
}
$bar = “something”;
foo();
var_dump($bar);
?>
PHP unset()函數(shù)被我們用來銷毀變量,但是往往在實(shí)際操作時(shí)不能使內(nèi)存中的數(shù)據(jù)進(jìn)行釋放。我們?cè)谖恼轮兄v為大家具體講解有關(guān)問題的解決辦法。
我們?cè)趯W(xué)習(xí)PHP語言的時(shí)候,通常都會(huì)各個(gè)函數(shù)的用法比較模糊,很那去一一的掌握。但是我們又必須要掌握這些函數(shù)。下面我們就為大家詳細(xì)介紹有關(guān)PHP unset()函數(shù)的相關(guān)使用方法。
PHP unset()函數(shù)是用來銷毀變量的,但很多時(shí)候,這個(gè)函數(shù)只把變量給銷毀了,內(nèi)存中存放的該變量的值仍然沒有銷毀,也就是沒能達(dá)到我們想要的釋放內(nèi)存的效果。這里我建議大家用 $變量=null 的方法來釋放其內(nèi)存。原因看了下面的就知道了。
以下是關(guān)于PHP unset()函數(shù)的幾點(diǎn)要點(diǎn):(以下均在windows環(huán)境下測(cè)試,php 2.5.9)
該函數(shù)只有在變量值所占空間超過256字節(jié)長的時(shí)候才會(huì)釋放內(nèi)存
只有當(dāng)指向該值的所有變量(比如有引用變量指向該值)都被銷毀后,地址才會(huì)被釋放(也要執(zhí)行1的判斷)
下面給出例子代碼論證:
< ?php
$test=str_repeat("1",256); //重復(fù)一個(gè)字符串,返回值為重復(fù)后組成的字符串
$s = memory_get_usage();
//該函數(shù)用來查看當(dāng)前所用內(nèi)存
unset($test);
$e = memory_get_usage();
echo ' 釋放內(nèi)存: '.($s-$e);
//輸出為272,但如果上面test變量改為$test=str_repeat("1",255),輸出則為0 ,變量值不足256不會(huì)釋放內(nèi)存的
?>
至于為什么是272而不是256,就不是很清楚了,不知道內(nèi)部是怎么處理的。
< ?php
$test = str_repeat("1",256);
$p = &$test;
unset($test);
echo $p;
//輸出為256個(gè)1。如果上面改為unset($p),更不行了,echo $test 直接顯示為256個(gè)1
?>
也就是說內(nèi)存中賦給$a的值仍然存在??梢妘nset()并沒達(dá)到釋放內(nèi)存的效果。
但如果在上述代碼中加入$test=null,或者再加一個(gè)unset($p),就能達(dá)到釋放內(nèi)存效果了,PHP unset()函數(shù)測(cè)試代碼如下:
變量賦值為null方法:
< ?php
$test = str_repeat("1",256);
$p = &$test;
$s = memory_get_usage();
$test = null;
unset($test); //試一下將該句與$test=null 調(diào)換先后順序,則結(jié)果將不相同
$e = memory_get_usage();
echo ' 釋放內(nèi)存: '.($s-$e);
//輸出為272
var_dump($p); //輸出為NULL
?>
將指向該地址中值的變量全部銷毀的方法:
< ?php
$test = str_repeat("1",256);
$p = &$test;
$s = memory_get_usage();
//注意,以下2個(gè)unset()順序?qū)φ{(diào)沒有關(guān)系,不影響結(jié)果
unset($p);
unset($test);
$e = memory_get_usage();
echo ' 釋放內(nèi)存: '.($s-$e); //輸出為272
?>
到此PHP unset()函數(shù)論證完畢。
PHP中語言中有些函數(shù)對(duì)于初學(xué)者來說在字面上是很難理解的,需要在實(shí)際編碼中總結(jié)經(jīng)驗(yàn),來掌握這些知識(shí)。我們今天要為大家介紹的是PHP unset全局變量在使用中遇到的一些問題。
PHP 中有個(gè)釋放變量的語句叫做unset(從PHP4開始unset已經(jīng)不再是一個(gè)函數(shù)了,而是一個(gè)語句),前幾天用unset的時(shí)候出了點(diǎn)問題,于是把 unset問題總結(jié)如下。如果您仔細(xì)閱讀過PHP的手冊(cè),那么就沒必要再看這篇文章了,這篇文章是寫給看手冊(cè)不用心的同學(xué)的。
首先要強(qiáng)調(diào)的一點(diǎn)是PHP unset全局變量在PHP中已經(jīng)不再是一個(gè)函數(shù)了,既然不是函數(shù),那么就沒有了返回值,所以用的時(shí)候不能夠用unset的返回值來做判斷。
其次,在函數(shù)中,PHP unset全局變量只能銷毀局部變量,并不能銷毀全局變量,來看下手冊(cè)的一個(gè)例子
復(fù)制代碼 代碼如下:
< ?PHP
function destroy_foo() {
global $foo;
unset($foo);
}
$foo = ‘bar';
destroy_foo();
echo $foo;
?>
返回的結(jié)果為
bar
為什么會(huì)這樣呢?原因就是PHP unset全局變量在函數(shù)中只能銷毀局部變量。如果在程序中需要用到銷毀全局變量的應(yīng)該如何做呢?也很簡單,用$GLOBALS數(shù)組來實(shí)現(xiàn)。看下面的例子:
復(fù)制代碼 代碼如下:
< ?PHP
function foo() {
unset($GLOBALS['bar']);
}
$bar = “something”;
foo();
var_dump($bar);
?>
PHP unset()函數(shù)被我們用來銷毀變量,但是往往在實(shí)際操作時(shí)不能使內(nèi)存中的數(shù)據(jù)進(jìn)行釋放。我們?cè)谖恼轮兄v為大家具體講解有關(guān)問題的解決辦法。
我們?cè)趯W(xué)習(xí)PHP語言的時(shí)候,通常都會(huì)各個(gè)函數(shù)的用法比較模糊,很那去一一的掌握。但是我們又必須要掌握這些函數(shù)。下面我們就為大家詳細(xì)介紹有關(guān)PHP unset()函數(shù)的相關(guān)使用方法。
PHP unset()函數(shù)是用來銷毀變量的,但很多時(shí)候,這個(gè)函數(shù)只把變量給銷毀了,內(nèi)存中存放的該變量的值仍然沒有銷毀,也就是沒能達(dá)到我們想要的釋放內(nèi)存的效果。這里我建議大家用 $變量=null 的方法來釋放其內(nèi)存。原因看了下面的就知道了。
以下是關(guān)于PHP unset()函數(shù)的幾點(diǎn)要點(diǎn):(以下均在windows環(huán)境下測(cè)試,php 2.5.9)
該函數(shù)只有在變量值所占空間超過256字節(jié)長的時(shí)候才會(huì)釋放內(nèi)存
只有當(dāng)指向該值的所有變量(比如有引用變量指向該值)都被銷毀后,地址才會(huì)被釋放(也要執(zhí)行1的判斷)
下面給出例子代碼論證:
復(fù)制代碼 代碼如下:
< ?php
$test=str_repeat("1",256); //重復(fù)一個(gè)字符串,返回值為重復(fù)后組成的字符串
$s = memory_get_usage();
//該函數(shù)用來查看當(dāng)前所用內(nèi)存
unset($test);
$e = memory_get_usage();
echo ' 釋放內(nèi)存: '.($s-$e);
//輸出為272,但如果上面test變量改為$test=str_repeat("1",255),輸出則為0 ,變量值不足256不會(huì)釋放內(nèi)存的
?>
至于為什么是272而不是256,就不是很清楚了,不知道內(nèi)部是怎么處理的。
復(fù)制代碼 代碼如下:
< ?php
$test = str_repeat("1",256);
$p = &$test;
unset($test);
echo $p;
//輸出為256個(gè)1。如果上面改為unset($p),更不行了,echo $test 直接顯示為256個(gè)1
?>
也就是說內(nèi)存中賦給$a的值仍然存在??梢妘nset()并沒達(dá)到釋放內(nèi)存的效果。
但如果在上述代碼中加入$test=null,或者再加一個(gè)unset($p),就能達(dá)到釋放內(nèi)存效果了,PHP unset()函數(shù)測(cè)試代碼如下:
變量賦值為null方法:
復(fù)制代碼 代碼如下:
< ?php
$test = str_repeat("1",256);
$p = &$test;
$s = memory_get_usage();
$test = null;
unset($test); //試一下將該句與$test=null 調(diào)換先后順序,則結(jié)果將不相同
$e = memory_get_usage();
echo ' 釋放內(nèi)存: '.($s-$e);
//輸出為272
var_dump($p); //輸出為NULL
?>
將指向該地址中值的變量全部銷毀的方法:
復(fù)制代碼 代碼如下:
< ?php
$test = str_repeat("1",256);
$p = &$test;
$s = memory_get_usage();
//注意,以下2個(gè)unset()順序?qū)φ{(diào)沒有關(guān)系,不影響結(jié)果
unset($p);
unset($test);
$e = memory_get_usage();
echo ' 釋放內(nèi)存: '.($s-$e); //輸出為272
?>
到此PHP unset()函數(shù)論證完畢。
您可能感興趣的文章:
- PHP unset函數(shù)原理及使用方法解析
- php中用unset銷毀變量并釋放內(nèi)存
- 關(guān)于php unset對(duì)json_encode的影響詳解
- php使用unset()刪除數(shù)組中某個(gè)單元(鍵)的方法
- PHP魔術(shù)方法__ISSET、__UNSET使用實(shí)例
- PHP中isset()和unset()函數(shù)的用法小結(jié)
- 解析PHP中的unset究竟會(huì)不會(huì)釋放內(nèi)存
- php中is_null,empty,isset,unset 的區(qū)別詳細(xì)介紹
- PHP中使用unset銷毀變量并內(nèi)存釋放問題
- php中session_unset與session_destroy的區(qū)別分析
- PHP中刪除變量時(shí)unset()和null的區(qū)別分析
- 深入理解php中unset()
相關(guān)文章
PHP 實(shí)現(xiàn)的將圖片轉(zhuǎn)換為TXT
今天在用PHP寫一個(gè)小插件的時(shí)候,遇到了一個(gè)小小的問題,就是需要將圖片轉(zhuǎn)換為TXT文本的內(nèi)容。簡單的說就是將圖片轉(zhuǎn)換為ASCII碼,下面把代碼分享給大家。2015-10-10學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)工廠模式(factory)
這篇文章主要介紹了php設(shè)計(jì)模式中的工廠模式,使用php實(shí)現(xiàn)工廠模式,感興趣的小伙伴們可以參考一下2015-12-12