Global問題
php裡面的global的使用。如下範例:
$name="even";//定義變數name,並初始化
function echoName()
{
//試圖引用函數外面的變數
echo "myname is ".//試圖引用函數外面的變數
echo "myname is ".name."
";
}
echoName();
?>
分析:
上面的程式碼的結果為:"myname is" 。而不是期望中的:"myname is even "。因為函數沒有傳遞參數$name的值,企圖引用外部變量,不會成功。這時候考慮使用global。
於是將上述程式碼改為
global $name="even";//用global宣告的同時賦值
function echoName()
{
//試圖引用函數外面的變數
".$name."
";
}
echoName();
?>
結果為:Parse error: syntax error, unexpected '=', expecting ',' 或 ';test in Dphp: on line 2
也即上述程式碼有錯誤。原因是不能在用global宣告變數的同時給變數賦值。
再次更改上述程式碼:
global $name;
$name="even";//將global宣告與賦值分開
function echoName()
{ myname is ".$name."
";
}
echoName();
?>
但所得到的結果仍為:"myname is" 。
原因是global的用法不對,global的正確用法是:"在一個函數中引入外部的一個變量,如果該變量沒有通過參數傳遞進來,那麼就通過global引入進來。" 也就是說,當一個函數引用一個外部變數時,可以在函數內透過global來聲明該變量,這樣該變數就可以在函數中使用了(相當於當作參數傳遞進來)。
於是進一步改動上述程式碼:
$name="even";//定義變數name,並初始化
function echoName()
global $name;
echo "myname is ".$name."
";
}
echoName();
?>
此時得到期望中的結果:"myname is even "。
以上程式碼說明,global是起傳遞參數的作用,而並非使變數的作用域為全域。以下程式碼證明了這一點:
$name="even";//宣告變數$name,並初始化
function echoName1()
{
//在函數echoName1()裡使用global來宣告$name
global $name;
echo "the first name is ".$name."
";
}
function echoName2()
{
//在函數echoName2()裡沒有使用gchoName2()來聲明"the second name is ".$name."
";
}
echoName1();
echoName2();
?>
結果是:
the first name is
結果是:
the first name is 髎結果說明在函數echoName2()中,$name變數仍然是未知的,因為沒有用global來聲明,也就沒有傳遞進去。同時也證明了global的作用並不是使變數的作用域為全域。
綜上,global的作用就相當於傳遞參數,在函數外部聲明的變量,如果在函數內想要使用,就用global來聲明該變量,這樣就相當於把該變量傳遞進來了,就可以引用該變數了。
當然,除了透過上述方法外,還可以使用全域數組$GLOBALS來解決問題,在需要用到外部變數的地方,使用$GLOBALS['var']就可以了。例:
$name="even";//定義變數name,並初始化
function echoName()
{
//透過全域數組$GLOBALS來引用外在變數['name']."
";
}
echoName();
?>
所得的結果為: myname is even 。
另外,使用global和$GLOBALS的時候,要注意大小寫問題,如果大小寫錯誤,關鍵字就不能起作用。