unset全域性變數運用問題詳解

2021-09-08 16:41:34 字數 2766 閱讀 4912

php unset全域性變數在實際使用中只能銷毀區域性變數,並不能實現全域性變數的目的。下面我們就來具體解決這一問題。希望對大家有所幫助。

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

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

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

其次,在函式中,php unset全域性變數只能銷毀區域性變數,並不能銷毀全域性變數,來看下手冊的乙個例子

1. < ?php

2. function destroy_foo()

6. $foo = 『bar』;

7. destroy_foo();

8. echo $foo;

9. ?>

返回的結果為

bar為什麼會這樣呢?原因就是php unset全域性變數在函式中只能銷毀區域性變數。如果在程式中需要用到銷毀全域性變數的應該如何做呢?也很簡單,用$globals陣列來實現。看下面的例子:

1. < ?php

2. function foo()

5. $bar = 「something」;

6. foo();

7. var_dump($bar);

8. ?>

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

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

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

以下是關於php unset()函式的幾點要點:(以下均在windows環境下測試,php 2.5.9)

1. 該函式只有在變數值所佔空間超過256位元組長的時候才會釋放記憶體

2. 只有當指向該值的所有變數(比如有引用變數指向該值)都被銷毀後,位址才會被釋放(也要執行1的判斷)

下面給出例子**論證:

1. < ?php

2. $test=str_repeat("1",256); //重複乙個字串,返回值為重複後組成的字串

3. $s = memory_get_usage();  

4. //該函式用來檢視當前所用記憶體

5. unset($test);

6. $e = memory_get_usage();

7. echo ' 釋放記憶體: '.($s-$e);  

8. //輸出為272,但如果上面test變數改為$test=str_repeat("1",255),輸出則為0 ,變數值不足256不會釋放記憶體的

9. ?>

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

1. < ?php

2. $test = str_repeat("1",256);

3. $p = &$test;

4. unset($test);

5. echo $p;  

6. //輸出為256個1。如果上面改為unset($p),更不行了,echo $test 直接顯示為256個1

7. ?>

也就是說記憶體中賦給$a的值仍然存在。可見unset()並沒達到釋放記憶體的效果。

但如果在上述**中加入$test=null,或者再加乙個unset($p),就能達到釋放記憶體效果了,php unset()函式測試**如下:

變數賦值為null方法:

1. < ?php

2. $test = str_repeat("1",256);

3. $p = &$test;

4. $s = memory_get_usage();  

5. $test = null;

6. unset($test); //試一下將該句與$test=null 調換先後順序,則結果將不相同

7. $e = memory_get_usage();

8. echo ' 釋放記憶體: '.($s-$e);

9. //輸出為272

10. var_dump($p); //輸出為null

11. ?>

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

1. < ?php

2. $test = str_repeat("1",256);

3. $p = &$test;

4. $s = memory_get_usage();  

5. //注意,以下2個unset()順序對調沒有關係,不影響結果

6. unset($p);

7. unset($test);  

8. $e = memory_get_usage();

9. echo ' 釋放記憶體: '.($s-$e); //輸出為272

10. ?>

到此php unset()函式論證完畢。

static全域性變數 全域性變數

1 全域性變數 外部變數 的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是...

全域性變數的問題

今天在工程裡新增了乙個專門放置全域性變數的標頭檔案,在別的很多c檔案中進行了引用,沒想到編譯的時候老是提示duplicate symbal g7task.說來自己也太差勁了,竟然忘了在c檔案中新增extern關鍵字來引用這個外部變數。而且要命的是在標頭檔案中是不能賦初值的,否則會遇到同樣的鏈結錯誤。...

php 全域性變數問題

當在函式裡通過require once包含另外php檔案。而另外php檔案包含了另外php檔案,而該php檔案的函式需要另外的php檔案。例子 installment maintenance submit.php檔案裡downloadzip函式在內部包含了reboottipsfunc.php fun...