国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

php unset全局變量運用問題的深入解析

2024-05-04 23:10:11
字體:
來源:轉載
供稿:網友
PHP unset全局變量在實際使用中只能銷毀局部變量,并不能實現全局變量的目的。下面我們就來具體解決這一問題。希望對大家有所幫助。

PHP中語言中有些函數對于初學者來說在字面上是很難理解的,需要在實際編碼中總結經驗,來掌握這些知識。我們今天要為大家介紹的是PHP unset全局變量在使用中遇到的一些問題。

PHP 中有個釋放變量的語句叫做unset(從PHP4開始unset已經不再是一個函數了,而是一個語句),前幾天用unset的時候出了點問題,于是把 unset問題總結如下。如果您仔細閱讀過PHP的手冊,那么就沒必要再看這篇文章了,這篇文章是寫給看手冊不用心的同學的。

首先要強調的一點是PHP unset全局變量在PHP中已經不再是一個函數了,既然不是函數,那么就沒有了返回值,所以用的時候不能夠用unset的返回值來做判斷。

其次,在函數中,PHP unset全局變量只能銷毀局部變量,并不能銷毀全局變量,來看下手冊的一個例子

復制代碼 代碼如下:


< ?PHP
function destroy_foo() {
global $foo;
unset($foo);
}
$foo = ‘bar';
destroy_foo();
echo $foo;
?>


返回的結果為
bar
為什么會這樣呢?原因就是PHP unset全局變量在函數中只能銷毀局部變量。如果在程序中需要用到銷毀全局變量的應該如何做呢?也很簡單,用$GLOBALS數組來實現。看下面的例子:

復制代碼 代碼如下:


< ?PHP
function foo() {
unset($GLOBALS['bar']);
}
$bar = “something”;
foo();
var_dump($bar);
?>


PHP unset()函數被我們用來銷毀變量,但是往往在實際操作時不能使內存中的數據進行釋放。我們在文章中講為大家具體講解有關問題的解決辦法。

我們在學習PHP語言的時候,通常都會各個函數的用法比較模糊,很那去一一的掌握。但是我們又必須要掌握這些函數。下面我們就為大家詳細介紹有關PHP unset()函數的相關使用方法。

PHP unset()函數是用來銷毀變量的,但很多時候,這個函數只把變量給銷毀了,內存中存放的該變量的值仍然沒有銷毀,也就是沒能達到我們想要的釋放內存的效果。這里我建議大家用 $變量=null 的方法來釋放其內存。原因看了下面的就知道了。

以下是關于PHP unset()函數的幾點要點:(以下均在windows環境下測試,php 2.5.9)
該函數只有在變量值所占空間超過256字節長的時候才會釋放內存
只有當指向該值的所有變量(比如有引用變量指向該值)都被銷毀后,地址才會被釋放(也要執行1的判斷)
下面給出例子代碼論證:

復制代碼 代碼如下:


< ?php
$test=str_repeat("1",256); //重復一個字符串,返回值為重復后組成的字符串
$s = memory_get_usage();
//該函數用來查看當前所用內存
unset($test);
$e = memory_get_usage();
echo ' 釋放內存: '.($s-$e);
//輸出為272,但如果上面test變量改為$test=str_repeat("1",255),輸出則為0 ,變量值不足256不會釋放內存的
?>


至于為什么是272而不是256,就不是很清楚了,不知道內部是怎么處理的。

復制代碼 代碼如下:


< ?php
$test = str_repeat("1",256);
$p = &$test;
unset($test);
echo $p;
//輸出為256個1。如果上面改為unset($p),更不行了,echo $test 直接顯示為256個1
?>


也就是說內存中賦給$a的值仍然存在。可見unset()并沒達到釋放內存的效果。
但如果在上述代碼中加入$test=null,或者再加一個unset($p),就能達到釋放內存效果了,PHP unset()函數測試代碼如下:
變量賦值為null方法:

復制代碼 代碼如下:


< ?php
$test = str_repeat("1",256);
$p = &$test;
$s = memory_get_usage();
$test = null;
unset($test); //試一下將該句與$test=null 調換先后順序,則結果將不相同
$e = memory_get_usage();
echo ' 釋放內存: '.($s-$e);
//輸出為272
var_dump($p); //輸出為NULL
?>


將指向該地址中值的變量全部銷毀的方法:

復制代碼 代碼如下:


< ?php
$test = str_repeat("1",256);
$p = &$test;
$s = memory_get_usage();
//注意,以下2個unset()順序對調沒有關系,不影響結果
unset($p);
unset($test);
$e = memory_get_usage();
echo ' 釋放內存: '.($s-$e); //輸出為272
?>


到此PHP unset()函數論證完畢。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 湘阴县| 镇原县| 日照市| 合作市| 利辛县| 扶余县| 巨鹿县| 汽车| 乌兰县| 泰和县| 揭东县| 香格里拉县| 湖北省| 卢湾区| 滨州市| 资源县| 依安县| 凌海市| 交城县| 华坪县| 保靖县| 奈曼旗| 北川| 甘泉县| 德钦县| 郓城县| 夏津县| 龙口市| 体育| 宾阳县| 石台县| 西林县| 白银市| 临邑县| 枣强县| 武汉市| 本溪市| 荔浦县| 富源县| 诸暨市| 乌兰县|