[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 編程技術 > Php > 正文
PHP4手冊:語法(二) 常量與變量
http://netleader.126.com 星空浪子 (2001-04-16 17:01:54)
這是第".$i."行\n";
}
echo "

--------------------------------------------------------------------------------
 常數型態 
--------------------------------------------------------------------------------
 


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 "
";
?>


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論壇

相關文章
PHP4手冊:函數庫及函數(四十六) SNMP 網管函式庫 (2001-04-18 16:56:55)
PHP4手冊:函數庫及函數(四十五) Solid 資料庫連結函式庫 (2001-04-18 16:54:16)
PHP4手冊:函數庫及函數(四十四) 信號與共享記憶體函式庫 (2001-04-18 16:49:09)
PHP4手冊:函數庫及函數(四十三) 常規表示法函式庫 (2001-04-18 16:40:33)
PHP4手冊:函數庫及函數(四十二) URL 處理函式庫 (2001-04-18 16:37:13)
PHP4手冊:函數庫及函數(四十一) PostgreSQL 資料庫函式庫 (2001-04-18 15:58:12)
PHP4手冊:函數庫及函數(四十) PDF 格式檔案函式庫 - 2 (2001-04-18 15:53:53)
PHP4手冊:函數庫及函數(四十) PDF 格式檔案函式庫 - 1 (2001-04-18 15:53:35)
PHP4手冊:函數庫及函數(三十九) Perl 相容語法函式庫 (2001-04-18 15:45:08)
PHP4手冊:函數庫及函數(三十八) Oracle 資料庫函式庫 (2001-04-18 15:43:09)

===更多相關===
 

★  樊強制作 歡迎分享  ★