
日期:2007-06-27 作者:喜騰小二 來源:PHPChina
就像大部份的結構化程式,有所謂的全域變數與局部變數,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."
";
}
myfunc(); // 哈
myfunc(); // 哈哈
myfunc(); // 哈哈哈
?>
函式在執行時所產生的變數,在函式結束時就消失了,有時因為程式的需要,函式在迴圈中,當不希望變數在每次執行完函式就消失的話,靜態變數 (static variable) 就派上用場了。上例中,使用 $mystr 變數之前,先在變數前麵加上 static,即表示變數 $mystr 是靜態變數,當每次執行 myfunc() 函式時,$mystr 的值會一直增加,每執行一次就多一個哈字。若將 static 的靜態變數定義拿掉,就沒辦法累加哈字了。
// 不是靜態變數的例子 (錯誤的)
function myfunc() {
$mystr.="哈";
echo $mystr."
";
}
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 "
";.$colorstr.">這是第".$i."行
}
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 好幾層之後,問題就浮現出來了。無論如何,保持良好的寫作習慣才是避免浪費青春的方法。