來源:藏色散人 發(fā)布時間:2019-01-10 10:49:03 閱讀量:999
對于php程序員來說,隨著php不同版本對于部分函數(shù)變量機(jī)制的更新改進(jìn),往往會讓大家因在不同版本下使用同一變量而出現(xiàn)不同結(jié)果時而產(chǎn)生疑惑。那么本篇文章主要給大家詳細(xì)解釋下,為什么在PHP5和PHP7版本下,使用同一global變量時會出現(xiàn)不同結(jié)果的問題?下面給大家舉一個簡單易懂的例子。
比如現(xiàn)有一個exl.php的頁面運(yùn)算代碼如下:
我們在本地php5版本環(huán)境下運(yùn)行出來的結(jié)果是5,如下截圖:
那么我們在php7版本環(huán)境下運(yùn)行的結(jié)果是3,如下截圖:
那么之所以會出現(xiàn)不同運(yùn)算結(jié)果,其實(shí)是因?yàn)樵谧钚碌膒hp7版本中,PHPglobal變量處理機(jī)制進(jìn)行了修改,此版本下global關(guān)鍵字現(xiàn)在只能引用簡單變量。所以當(dāng)我們在本地php5版本環(huán)境下運(yùn)算時,輸出的$y的值就是$x+$y=5,此時的global就相當(dāng)于全局變量使用。而在php7環(huán)境下,輸出的$y的值卻是$y=3,此時global變量只能直接引用簡單變量$y。
那么通過以上的示例代碼解釋,希望本篇文章關(guān)于php中g(shù)lobal變量在不同版本下運(yùn)算產(chǎn)生不同結(jié)果的問題,對大家遇到相關(guān)問題時有所幫助,也希望大家通過此篇文章對不同版本下php global用法有所理解。
簡單介紹下,什么是php全局變量global?首先phpglobal作用域不是應(yīng)用于整個網(wǎng)站,而是應(yīng)用于當(dāng)前頁面,包括include或require的所有文件。但是在函數(shù)體內(nèi)定義的global變量,函數(shù)體內(nèi)可以使用,在函數(shù)體外定義的global變量不能在函數(shù)體內(nèi)使用。
這里也順帶提下php $GLOBALS變量 即引用全局作用域中可用的全部變量, 在 $GLOBALS 數(shù)組中,每一個變量為一個元素,鍵名對應(yīng)變量名,值對應(yīng)變量的內(nèi)容。$GLOBALS 之所以在全局范圍內(nèi)存在,是因?yàn)?$GLOBALS 是一個超全局變量。注意$GLOBALS 的寫法,比如變量$a1,寫法為$GLOBALS[‘a(chǎn)1’]。
那么下面用個淺而易懂得例子給大家詳細(xì)解釋下global在php中出現(xiàn)無效的問題:
首先demo1.php頁面代碼如下:
1 2 3 4 5 6 7 |
|
demo2.php頁面代碼如下:
1 2 3 4 5 6 7 |
|
當(dāng)我們訪問demo1.php頁面,能夠正確顯示出歡迎語句。然而當(dāng)我們使用瀏覽器訪問demo2.php頁面輸出結(jié)果卻如下:
1 |
|
我們在函數(shù)include_view_page()中調(diào)用sayHi()函數(shù)時,demo2.php頁面sayHi()函數(shù)中g(shù)lobal的$site_name卻沒有被正確識別、生效。
其實(shí)當(dāng)我們在函數(shù)include_view_page()中include demo2.php頁面時,demo2.php頁面的變量$site_name就相當(dāng)于存放在include_view_page()函數(shù)內(nèi)的作用域中。大家都知道在函數(shù)內(nèi)global一個變量實(shí)際上是在函數(shù)內(nèi)建立一個對頁面全局變量的引用。而在這個例子中,$site_name變量對于demo1.php而言,它僅僅是include_view_page()函數(shù)內(nèi)的局部變量,因此無法顯示global變量,我們進(jìn)行相關(guān)調(diào)用時是無法獲取到正確的變量和變量值。
在php中,我們尤其需要注意類似上述在函數(shù)內(nèi)include某個頁面,導(dǎo)致該頁面中變量的作用域發(fā)生改變的問題。為了避免這種情況,我們應(yīng)該盡量減少多層次的include調(diào)用,也盡量不要在函數(shù)內(nèi)使用include。此外,我們還可以在demo2.php的頁面中將$site_name進(jìn)行全局變量形式的聲明。
1 2 3 4 5 6 7 8 9 |
|
函數(shù)中如何引用全局變量示例如下:
輸出的結(jié)果如下:
var2 is set to ‘xxxxxx’
var2 is set to ‘eeee’
可見,上面的代碼中:
$var2 =&$var1; //1 只對函數(shù)內(nèi)部可見。 而 $GLOBALS[“var2”] =&$var1; //2 在全局范圍內(nèi)可見。
希望本篇文章介紹關(guān)于php global出現(xiàn)無效的問題對大家有所幫助!