--------------------------------------------------------------------------------
常數型態
--------------------------------------------------------------------------------
PHP 在常數中定義了以下一些常數。
__FILE__
這個內定常數是 PHP 程式檔名。若引用檔案 (include 或 require)則在引用檔案內的該常數為引用檔案名,而不是引用它的檔案名。
__LINE__
這個內定常數是 PHP 程式行數。若引用檔案 (include 或 require)則在引用檔案內的該常數為引用檔案的行,而不是引用它的檔案行。
PHP_VERSION
這個內建常數是 PHP 程式的版本,如 '3.0.8-dev'。
PHP_OS
這個內建常數指執行 PHP 剖析器的作業系統名稱,如 'Linux'。
TRUE
這個常數就是真值 (true)。
FALSE
這個常數就是偽值 (false)。
E_ERROR
這個常數指到最近的錯誤處。
E_WARNING
這個常數指到最近的警告處。
E_PARSE
本常式為剖析語法有潛在問題處。
E_NOTICE
這個常式為發生不尋常但不一定是錯誤處。例如存取一個不存在的變數。
這些 E_ 開頭形式的常數,可以參考 error_reporting() 函式,有更多的相關說明。
當然在程式寫作時,以上的內定常數是不夠用。define() 的功能可以讓我們自行定義所需要的常數。見下例
define("COPYRIGHT", "Copyright © 1999, Wilson Peng");
echo COPYRIGHT; // 送出 "Copyright © 1999, Wilson Peng" 字串。
?>
--------------------------------------------------------------------------------
變數型態
--------------------------------------------------------------------------------
PHP 的變數型態不多,有以下五種:
string
integer
double
array
object
string 即為字串變數,無論是單一字元或數千字的字串都是使用這個變數型態。值得注意的是要指定字串給字串變數,要在頭尾加上雙引號 (例如: "這是字串")。在欲讓字串換行時,可使用溢出字元,也就是反斜線加上指定的符號,若是 \x 加上二位數字,如 \xFE 即表十六進位字元,詳見下表:
符號 意義
\" 雙引號
\\ 反斜線
\n 換行
\r 送出 CR
\t 跳位 (TAB)
integer 為整數型別。在 32 位元的作業系統中,它的有效范圍是 -2,147,483,648 到 +2,147,483,647。要使用 16 進位整數可以在面加 0x。
double 為浮點數型別。在 32 位元的作業系統中,它效范圍是 1.7E-308 到 1.7E+308。
array 為陣列變數,可以是二維、三維或者多維陣列,其中的元素也很自由,可以是 string、integer 或者 double,甚至是 array。
object 為物件變數,目前在 PHP 中的物件不多,若論及物件,Microsoft 的 ASP 物件仍然較 PHP 的內定物件多,相信這有賴大家的努力。不過話又說回來,Web CGI 程式要求的是效率,以完全物件導向的方式,恐怕使用者在瀏覽時也會因為程式執行速度慢而很不耐煩吧。
要使用變數,只要在英文字串前面加個錢號 $ 即可,目前變數名稱仍不能使用中文。至變數的大小寫是不一樣的,對開發 PHP 程式的 TEAM 來說,最好使用相同的變數使用風格,以免屆時因為變數大小的問題,花許多無謂的時間去找尋問題點,那就麻煩了。
以下為變數的使用范例:
$mystring = "我是字串";
$WilsonPeng = "真是認真的作者";
$NewLine = "換行了\n";
$int1 = 38;
$int2 = 49;
$hexint = 0x10;
$float1 = 1.732;
$float2 = 1.4E+2;
$MyArray1 = array("子", "醜", "寅", "卯");
$MyArray2 = array(
"地支" => array("子", "醜", "寅", "卯"),
"生肖" => array("鼠", "牛", "虎", "兔"),
"數字" => array(1, 2, 3, 4)
);
物件的使用上就比較麻煩了,要先宣告類別,甚至必須先要方法,方可使用物件,如下例:
class foo {
function do_foo () {
echo "Doing foo.";
}
}
$bar = new foo;
$bar -> do_foo ();
更多有關物件的討論,參考 物件
此外,還有布林值 (boolean),通常 1 即為 true,0 為 false。
在變數之間,若要轉換型態,在 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 的值。
// 本程式使用 $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 "\n";
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 好幾層之,問題就浮現出來了。無論如何,保持良好的寫作習慣才是避免浪費青春的方法。
(http://www.fanqiang.com)
進入【UNIX論壇】
|