今天在寫架構的時候想把SaeMySQL初始化之後作為全域變數使用。
但是後來發現PHP中的全域變數和Java或者OC中的全域變數還是有較大區別的。
下面記錄一下php裡面的global的使用相關注意事項。
1.有些場合需要全域變數的出現,如下例子:
<?php$name="why";//定義變數name,並初始化function echoName(){//試圖引用函數外面的變數echo "myname is ".$name."<br>";}echoName();?>
上面的代碼的結果為:"myname is" 。而不是期望中的:"myname is why"。因為函數沒有傳遞參數$name的值,企圖引用外部變數,不會成功。這時候考慮使用global。
2.於是將上述代碼改為
<?phpglobal $name="why";//用global聲明的同時賦值function echoName(){//試圖引用函數外面的變數echo "myname is ".$name."<br>";}echoName();?>
結果為:Parse error: syntax error, unexpected '=', expecting ',' or ';' in http:\\xxxxxxx.com on line 2
也即上述代碼有錯誤。原因是不能在用global聲明變數的同時給變數賦值。
3.再次更改上述代碼:
<?phpglobal $name;$name="why";//將global聲明與賦值分開function echoName(){//試圖引用函數外面的變數echo "myname is ".$name."<br>";}echoName();?>
但是得到的結果依然為:"myname is" ,原因是global的用法不對。
global的正確用法是:"在一個函數中引入外部的一個變數,如果該變數沒有通過參數傳遞進來,那麼就通過global引入進來。" 也就是說,當一個函數引用一個外部變數時,可以在函數內通過global來聲明該變數,這樣該變數就可以在函數中使用了(相當於當作參數傳遞進來)。
4.於是進一步改動上述代碼:
<?php$name="why";//定義變數name,並初始化function echoName(){//通過global來聲明$name,相當於傳遞參數global $name;echo "myname is ".$name."<br>";}echoName();?>
此時得到期望中的結果:"myname is why"。
以上代碼說明,global是起傳遞參數的作用,而並非使變數的範圍為全域。
5.以下代碼證明了這一點:
<?php$name="why";//聲明變數$name,並初始化function echoName1(){//在函數echoName1()裡使用global來聲明$nameglobal $name;echo "the first name is ".$name."<br>";}function echoName2(){//在函數echoName2()裡沒有使用global來聲明$nameecho "the second name is ".$name."<br>";}echoName1();echoName2();?>
結果為:
the first name is why
the second name is
上面的結果說明在函數echoName2()中,$name變數仍然是未知的,因為沒有用global來聲明,也就沒有傳遞進去。同時也證明了global的作用並不是使變數的範圍為全域。
綜上,global的作用就相當於傳遞參數,在函數外部聲明的變數,如果在函數內想要使用,就用global來聲明該變數,這樣就相當於把該變數傳遞進來了,就可以引用該變數了。
當然,除了通過上述方法外,還可以使用全域數組$GLOBALS來解決問題,在需要用到外部變數的地方,使用$GLOBALS['var']就可以了。例:
<?php$name="why";//定義變數name,並初始化function echoName(){//通過全域數組$GLOBALS來引用外部變數echo "myname is ".$GLOBALS['name']."<br>";}echoName();?>
得到的結果為: myname is why 。