PHP完全中文操作手冊

天地JPLOP | PHP首頁 | 函數索引
變量的使用
就像大部份的結構化程序,有所謂的全局變量與局部變量,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 的值。

<?php
// 本程序使用 $GLOBALS 數組
function myfunc() {
echo
$GLOBALS["PHP_SELF"];
}
myfunc();
?>

下面是錯誤的示範,請勿模仿,上面的纔是正確的示範。

<?php
// 這是錯誤的示範
function errfunc() {
echo
$PHP_SELF;
}
errfunc();
?>

但是這個錯誤的示範要是改成下例就沒問題了

<?php
// 本程序使用全局定義
function myfunc() {
global
$PHP_SELF;
echo
$PHP_SELF;
}
myfunc();
?>

在變量前面加上 global 的名稱,就是定義該變量為全局變量。用這種方式,就不需使用 $GLOBALS 數組,也能讓變量進入自行開發的函數中。

接下來先看靜態變量的例子

<?php
// 靜態變量的例子
function myfunc() {
static
$mystr;
$mystr.="哈";
echo
$mystr."<br>\n";
}
myfunc(); // 哈
myfunc(); // 哈哈
myfunc(); // 哈哈哈
?>

函數在執行時所產生的變量,在函數結束時就消失了,有時因為程序的需要,函數在循環中,當不希望變量在每次執行完函數就消失的話,靜態變量 (static variable) 就派上用場了。上例中,使用 $mystr 變量之前,先在變量前面加上 static,即表示變量 $mystr 是靜態變量,當每次執行 myfunc() 函數時,$mystr 的值會一直增加,每執行一次就多一個哈字。若將 static 的靜態變量定義拿掉,就沒辦法累加哈字了。

<?php
// 不是靜態變量的例子 (錯誤的)
function myfunc() {
$mystr.="哈";
echo
$mystr."<br>\n";
}
myfunc(); // 哈
myfunc(); // 哈
myfunc(); // 哈
?>

再看一個比較實際的例子,它是處理表格的顏色,讓隔行的顏色不同。

<?php
function TdBackColor() {
static
$ColorStr;
if (
$ColorStr=="808080") {
$ColorStr="c0c0c0";
} else {
$ColorStr="808080";
}
return(
$ColorStr);
}
echo
"<table border=1>\n";
for (
$i=0; $i<10; $i++) {
$ColorStr=TdBackColor();
echo
"<tr><td bgcolor=".$ColorStr.">這是第".$i."行</td></tr>\n";
}
echo
"</table>";
?>

PHP 的變量使用技巧上,最令人覺得不可思議的則是變量的變量 (variable variable)。這是充分利用 PHP 特性玩出的特殊技巧

<?php
$a
= "Hello";
$
$a = "world";
echo
"$a, $hello"; // Hello, world
echo "$a, {$a}"; // 也是 Hello, world
?>

mdean@kcnet.com 舉出一個更絕的例子 (24-Apr-1999),他稱為變量的函數 (variable function)

<?php
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 實在是太神奇了。

<form action=next.php method=post>
姓名: <input type=text name="username"><br>
性別: <input type=text name="sex"><br>
<input type=submit>
</form>

由於 PHP 許多語法都是 C 語言的翻版,故 PHP 在使用變量時,隨時都可以使用新的變量,隻要在使用前將變量初始化就好了,不必像 Pascal 語言那樣嚴謹,所有要使用的變量都要事先定義。這當然有好處與壞處:好處是使用方便、自由;壞處就是常常因這些自由而付出相當大的代價調試。在程序碼短的 PHP 程序當然不成問題,當程序在數百數千行,甚至 include 或 require 好幾層之後,問題就浮現出來了。無論如何,保持良好的寫作習慣纔是避免浪費青春的方法。



整理: 夕垌菪姬 (天地JPLOP)

[ 上一頁 回主目錄 下一頁 ]
版權所有,天地JPLOP、爵堤亞(夕垌菪姬)。網頁背景音樂和各鍊結標題
及鍊結內容和文章小說,版面編排皆歸原權利人所有對本版面
有任何意見或指教,歡迎至論壇指教。