變數的使用

日期: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 好幾層之後,問題就浮現出來了。無論如何,保持良好的寫作習慣才是避免浪費青春的方法。

<<<返回技術中心

技術文章

站內新聞

我要啦免费统计