來源:www.cncfan.com?|?2006-1-11?|?(有1856人讀過)
就像大部份的結構化程序,有所謂的全局變量與局部變量,PHP 在這方面也是有相似之處。
在 PHP 的程序執行時,系統會在內存中保留一塊全局變量的區域。實際運用時,可以透過 $GLOBALS["變量名稱"] 將需要的變量取出。在用戶自定的函數或程序中,就可以用 $GLOBALS 數組取出需要的變量。當然別忘了 PHP 的變量是區分大小寫的,搞錯了大小寫可是叫一百年,變量也不會出來。
$GLOBALS 數組是 PHP 程序中比較特殊的變量,不必定義,系統會自動匹配相關的變量在里面。在函數中,也不必管 $GLOBALS 數組是否已經做全局定義,就可以直接使用了。
和 $GLOBALS 變量類似的還有 $php_errormsg 字符串變量。若 PHP 的配置文件 (php.ini/php3.ini) 中的 track_errors 選項打開的話,會有全局變量 $php_errormsg 可以看到錯誤的信息。
在 PHP 中,全局變量的有效范圍 (scope) 僅限于主要程序中,不會影響到函數中同名的變量,也就是全局變量與局部變量互不侵犯。若要變量能通透到函數中,就要用到 $GLOBALS 數組或是使用 global 定義。
例如,在自行開發的函數中,要取得目前執行 PHP 程序頁面的文件名,就可以用 $GLOBALS["PHP_SELF"] 取出 $PHP_SELF 的值。
// 本程序使用 $GLOBALS 數組
function myfunc() {
echo $GLOBALS["PHP_SELF"];
}
myfunc();
?>
下面是錯誤的示范,請勿模仿,上面的才是正確的示范。
// 這是錯誤的示范
function errfunc() {
echo $PHP_SELF;
}
errfunc();
?>
但是這個錯誤的示范要是改成下例就沒問題了
// 本程序使用全局定義
function myfunc() {
global $PHP_SELF;
echo $PHP_SELF;
}
myfunc();
?>
在變量前面加上 global 的名稱,就是定義該變量為全局變量。用這種方式,就不需使用 $GLOBALS 數組,也能讓變量進入自行開發的函數中。
接下來先看靜態變量的例子
// 靜態變量的例子
function myfunc() {
static $mystr;
$mystr.="哈";
echo $mystr."
\n";
}
myfunc(); // 哈
myfunc(); // 哈哈
myfunc(); // 哈哈哈
?>
函數在執行時所產生的變量,在函數結束時就消失了,有時因為程序的需要,函數在循環中,當不希望變量在每次執行完函數就消失的話,靜態變量 (static variable) 就派上用場了。上例中,使用 $mystr 變量之前,先在變量前面加上 static,即表示變量 $mystr 是靜態變量,當每次執行 myfunc() 函數時,$mystr 的值會一直增加,每執行一次就多一個哈字。若將 static 的靜態變量定義拿掉,就沒辦法累加哈字了。
// 不是靜態變量的例子 (錯誤的)
function myfunc() {
$mystr.="哈";
echo $mystr."
\n";
}
myfunc(); // 哈
myfunc(); // 哈
myfunc(); // 哈
?>
再看一個比較實際的例子,它是處理表格的顏色,讓隔行的顏色不同。
function TdBackColor() {
static $ColorStr;
if ($ColorStr=="808080") {
$ColorStr="c0c0c0";
} else {
$ColorStr="808080";
}
return($ColorStr);
}
echo "
for ($i=0; $i<10; $i++) {
$ColorStr=TdBackColor();
echo "
這是第".$i."行\n";}
echo "
";?>
PHP 的變量使用技巧上,最令人覺得不可思議的則是變量的變量 (variable variable)。這是充分利用 PHP 特性玩出的特殊技巧
$a = "Hello";
$$a = "world";
echo "$a, $hello"; // Hello, world
echo "$a, {$a}"; // 也是 Hello, world
?>
mdean@kcnet.com 舉出一個更絕的例子 (24-Apr-1999),他稱為變量的函數 (variable function)
function myCallbackFunction()
{
print("Hello from callback");
}
function myFunction($callback)
{
$callback();
}
// call to myFunction passing callback
// function as parameter
myFunction("myCallbackFunction");
?>
至于用戶在 FORM 中輸入的資料,要怎么處理呢?要是在 PHP 的配置文件中,track_vars 設為 On 時,直接使用變量名字就好了。如下例,next.php 在執行時,系統會自動產生兩個變量 $username 及 $sex,直接使用就好了,比起傳統的 CGI 要自己解析,PHP 實在是太神奇了。
姓名:
性別:
由于 PHP 許多語法都是 C 語言的翻版,故 PHP 在使用變量時,隨時都可以使用新的變量,只要在使用前將變量初始化就好了,不必像 Pascal 語言那樣嚴謹,所有要使用的變量都要事先定義。這當然有好處與壞處:好處是使用方便、自由;壞處就是常常因這些自由而付出相當大的代價調試。在程序碼短的 PHP 程序當然不成問題,當程序在數百數千行,甚至 include 或 require 好幾層之后,問題就浮現出來了。無論如何,保持良好的寫作習慣才是避免浪費青春的方法。