話不多說,code is the true。
第一段:
class Globals{
public $var = array();
function __construct(){
global $_fanwe;
$_fanwe=2;
}
}
new Globals();
function Nice(){
global $_fanwe;
echo $_fanwe;
}
Nice();
input :2
第二段:
function globals(){
global $_fanwe;
$_fanwe=2;
}
function Text(){
global $_fanwe;
echo $_fanwe;
}
globals();
Text();
input :2
以上的兩個檔案分別測試,得出的結果依然是2。原因是全域變數在php編譯的時候已經註冊了全域變數並且駐足於php記憶體當中,直到該php的進程結束,php的記憶體回收機制銷毀掉這個全域變數。
php在編譯時間,當某個定義的函數被調用時,php會給該函數分配一定的記憶體空間和一定的資源作為執行該函數的條件,分給函數的空間無非就是儲存變數以及函數執行過程中需要返回的結果,反正這部分空間作為一個php進程裡面的空間,所以,當這個函數裡面定義了一個全域變數,這個全域變數也將會被放進該函數被分配的記憶體當中,雖然函數裡面定義的全域變數,由於駐足於記憶體當中,所以可以被其它函數當做真正的全域變數來使用。注意一點,能這麼使用的前提是在你使用這個全域變數前一定要讓這個全域變數駐足於記憶體,也就是先調用含有這個全域變數的函數(這是這個全域變數駐足於記憶體了),你才能使用這個全域變數。為了驗證,再來看看下面一段代碼以及它的輸出:
function globals(){
global $_fanwe;
$_fanwe=2;
}
function Text(){
global $_fanwe;
echo $_fanwe;
}
Text();
其實這個函數是沒有任何輸出的,因為在Text連$_fanwe沒有被賦值,你可能會問在globals這個函數上面不是已經定義$_fanwe;為全域變數而且還為其賦值了嗎?怎麼還沒輸出呢?對比上段程式,你可以發現並沒有調用globals()函數。。沒有調用,自然記憶體沒有,你哪能輸出?
說這麼多,其實類也是一樣,一個類沒有被執行個體化之前只是個虛構的定義,並不存在於記憶體當中,一旦執行個體化了這個類,php就會給這個類分配記憶體,駐足於記憶體,直到這個php進程結束或者在該php進程當中結束這個類,這個全域變數才消失,道理是和上面舉的函數一樣的。
唉,說這麼多是因為研究了一些架構有感而發。。。
以上就介紹了php全域變數的記憶體管理,包括了方面的內容,希望對PHP教程有興趣的朋友有所協助。