|
<?php require("http://php.wilson.gs"); // 回首頁 echo "http://php.wilson.gs/bible/3.2.3.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 的值。
下面是錯誤的示範,請勿模仿,上面的才是正確的示範。
但是這個錯誤的示範要是改成下例就沒問題了
在變數前面加上 global 的名稱,就是宣告該變數為全域變數。用這種方式,就不需使用 $GLOBALS 陣列,也能讓變數進入自行開發的函式中。 接下來先看靜態變數的例子
函式在執行時所產生的變數,在函式結束時就消失了,有時因為程式的需要,函式在迴圈中,當不希望變數在每次執行完函式就消失的話,靜態變數 (static variable) 就派上用場了。上例中,使用 $mystr 變數之前,先在變數前面加上 static,即表示變數 $mystr 是靜態變數,當每次執行 myfunc() 函式時,$mystr 的值會一直增加,每執行一次就多一個哈字。若將 static 的靜態變數宣告拿掉,就沒辦法累加哈字了。
再看一個比較實際的例子,它是處理表格的顏色,讓隔行的顏色不同。
PHP 的變數使用技巧上,最令人覺得不可思議的則是變數的變數 (variable variable)。這是充分利用 PHP 特性玩出的特殊技巧
<?php mdean@kcnet.com 舉出一個更絕的例子 (24-Apr-1999),他稱為變數的函式 (variable function)
至於使用者在 FORM 中輸入的資料,要怎麼處理呢?要是在 PHP 的設定檔中,track_vars 設為 On 時,直接使用變數名字就好了。如下例,next.php 在執行時,系統會自動產生二個變數 $username 及 $sex,直接使用就好了,比起傳統的 CGI 要自己剖析,PHP 實在是太神奇了。
<form action=next.php method=post> 由於 PHP 許多語法都是 C 語言的翻版,故 PHP 在使用變數時,隨時都可以使用新的變數,只要在使用前將變數初始化就好了,不必像 Pascal 語言那樣嚴謹,所有要使用的變數都要事先宣告。這當然有好處與壞處:好處是使用方便、自由;壞處就是常常因這些自由而付出相當大的代價除錯。在程式碼短的 PHP 程式當然不成問題,當程式在數百數千行,甚至 include 或 require 好幾層之後,問題就浮現出來了。無論如何,保持良好的寫作習慣才是避免浪費青春的方法。
|
|
mail("wilson@biglobe.net.tw", "Feedback", $message); ?> |