第 4 章 PHP 基本語法
本章重點 4 - 1 資料型別與變數 4 - 2 陣列 4 - 3 使用常數 4 - 4 運算子與運算式 4 - 5 流程控制 4 - 6 表單資料傳遞
本章重點 4 - 7 重要內建變數 4 - 8 實戰演練 - 陽春登入及歡迎網頁 4 - 9 實戰演練 - 兒童加減計算機 4 - 10 實戰演練 - 飲料訂購表單
PHP 基本語法 上一章介紹了如何撰寫 PHP 網頁, 本章要更進一步介紹 PHP 語法, 包括資料型別、運算子、運算式、流程控制等。
4 - 1 資料型別與變數 撰寫程式免不了要使用變數來存放資料。 在 C / C++、Java 這類程式語言, 使用變數前必須先宣告 (Declare) 變數所屬的資料型別 (Data Type)。 但 PHP 與這些程式語言不同, 使用變數時不必宣告變數的資料型別, 需用到變數時, 直接寫出即可。
變數名稱 PHP 的變數名稱均是以 $ 符號開頭, 之後再接變數的名稱。 變數名稱第 1 個字必須是英文字母或底線符號 _, 之後則可使用任何文數字。 但要特別注意, 變數名稱在 PHP 中有區分大小寫, PHP 指令則不分大小寫。 例如 echo 也可寫成 ECHO, 功能都相同, 但 $var 和 $VAR 則是兩個不同的變數。
資料型別 PHP 的變數可存放下列幾種類型的資料: 布林值 (boolean) 整數 (integer) 浮點數 (float, floating-point) 字串 (string) 陣列 (array) 物件 (object) 資源 (resource) 空值 (null)
資料型別 其中陣列與物件分別會在 4-2 節與第 13 章介紹。 而資源型別的變數, 通常是使用某些特定功能 (例如查詢資料庫、讀取檔案) 所傳回的代表該項資源的相關變數, 在後續各章有用到時會適時說明。
資料型別 本節只介紹另外 5 種資料類型:
浮點數的精確度 在此我們要提醒讀者, 電腦的浮點數無法精確表示真實世界的小數數值, 因此應避免做比較兩個浮點數是否相等之類的動作。 由於電腦使用二進位的運算, 因此表示小數時, 是用 1/2、1/4、1/8... 的數字來表示我們所要存放的數值, 因此很多時候只能『逼近』我們所要的數值, 而非『相等』。
浮點數的精確度 以 0.1 這個簡單的數字為例, 存在電腦中也只是『近似 0.1』的值, 在一般運算後輸出, 由於浮點數小數點後十多位的 4 捨 5 入處理, 所以看起來都是正確的。 但如果反複使用, 近似值與 0.1 間微小的差距, 就逐漸被放大, 出現不精確的結果。 舉例來說, 在 PHP 中將 0.1 相加七萬次, 不會得到整數 7000, 而是 7000.00000001。
PHP 的字串表示法 在 PHP 中, 字串可使用下列 3 種表示法: 以下分別說明這幾種用法及其差異。 使用單引號 ('):適用於一般性的字串。 使用雙引號 ("):適用於需表示含特殊符號或變數內含值的字串。 使用 heredoc 表示法:適用於多行的字串。 以下分別說明這幾種用法及其差異。
單引號表示法 單引號表示法是最單純的字串表示法, 只是要表示普通、簡短的文字字串時, 都可使用單引號來括住字串, 就像前面範例的應用一樣。 如果字串中也含有單引號, 就必須加上一個反斜線 (\), 這樣 PHP 才不會誤將字串內的單引號當成代表字串『結束』的單引號。 加上反斜線的表示法稱為跳脫序列 (Escape Sequence), 表示反斜線後面符號, 要跳出原本在 PHP 中的意思。
單引號表示法 而如果要輸出反斜線本身, 則需將反斜線連寫兩次:
雙引號表示法 使用雙引號 (") 表示字串的方式, 與使用單引號相似, 直接在字串前後用雙引號括住字串即可。 雙引號字串可使用的跳脫序列較多, 除了 \\ 與 \' 之外, 還有下列幾個。
雙引號表示法 在雙引號字串使用單引號就不需使用跳脫序列了, 直接寫出即可。
雙引號表示法 例如: 使用雙引號字串與單引號字串的最大差異, 就是 PHP 會解譯雙引號字串中的變數名稱。
雙引號表示法 執行結果:
雙引號表示法 程式分別建立了 2 個變數, 其中 $str 變數存放的是字串 "我有", 而 $money 存的則是數值 100。 由執行結果可發現, PHP 輸出雙引號字串時, 會將其中的變數名稱替換成變數值。 所以:『"$str $money 元"』中的 $str、$money 分別被換成 "我有" 和 "100", 因此最後輸出時就變成『我有 100 元』了。 但 PHP 不會處理單引號字串中的變數名稱, 所以第 2 個 echo 指令就依原樣輸出。
使用 heredoc 表示多行的字串 PHP 還有一種用以表示多行字串的 heredoc 表示法。 其語法是在字串開頭加上 <<< 符號及一個用以代表此字串結束的『自訂名稱』, 並在字串結尾的下一行也用『自訂名稱』表示字串結束:
使用 heredoc 表示多行的字串 請特別注意, 字串結尾的『自訂名稱』, 一定要放在該行行首, 前後均不可有空白或註解, 否則 PHP 會產生錯誤訊息。 由以下實例即可瞭解其用法:
使用 heredoc 表示多行的字串 執行結果:
使用 heredoc 表示多行的字串 heredoc 表示法優點在於:變數名稱可以被 PHP 代換為變數值, 而且可以直接使用單引號、雙引號、反斜線等符號, 不需使用跳脫序列。 上面 $page 變數如果改用一般方式設定的話, 必須使用下面比較繁雜的格式:
4 - 2 陣列 使用前述資料型別的變數, 雖可很方便的儲存各式資料, 但因一個變數只能放一筆資料, 所以不適合處理大批資料。 例如要用變數記錄 100 個學生的成績, 以前面介紹的方式就要設定 100 個變數, 不但寫起很費工夫, 也很容易出錯。 在處理大量資料時, 使用陣列來代替多個變數較為方便。
陣列
一維陣列 以索引的方式建立陣列 建立陣列的語法如下: 如果未指定索引值, 會自動從 0 開始, 而後面的元素索引則會自動接著前一個元素索引按順序編號。 若要指定索引編號, 亦可不按順序指定。
一維陣列
一維陣列 除了使用數字做為索引外, 您也可以使用『字串』當索引, 同樣以學生分數陣列為例, 我們可用學生的名字來當成索引: 不管是數字索引或字串索引的陣列, 其用法都相同。
一維陣列 以 array() 函式建立一維陣列 唯一不同之處在於:若要在雙引號字串中, 使用字串索引的陣列元素, 需額外加上大括號 {}, PHP 才能正常解譯並代換其值: 以 array() 函式建立一維陣列 以一個個設定元素值的方式來建立陣列, 仍然非常不便, 因此 PHP 提供一個建立陣列的函式 array()。其語法如下:
一維陣列 如果使用數字索引時, 可以不設索引值 (自動從 0 開始算), 也可以自行指定數字或字串做為索引, 或只指定第 1 個索引值 (後面的依序遞增)。 例如:
二維陣列與多維陣列 在前面介紹中, 我們用一維陣列 $student 就可以記錄一個班級中同學的成績, 但是若有多個班級的學生成績要記錄, 就必須用到二維陣列。 下圖是一個學生成績的二維陣列示意圖, 其中, 第 1 個索引表示第 n 班, 第 2 個索引是學生編號。
二維陣列與多維陣列 二維陣列其實可以看成多個一維陣列的組合。
二維陣列與多維陣列 例如上圖共有兩個一維陣列:$student[0]、$student[1], 而 $student[0] 的第 3 個元素便是 $student[0][2]。 所以建立二維陣列時, 可以使用兩層的 array() 函式來建立:
二維陣列與多維陣列 按照此語法, 上面學生成績二維陣列可用如下的方式來建立: 除了使用 array 直接建立二維陣列以外, 您也可以先建立好一維陣列, 然後再放進另一個陣列中:
二維陣列與多維陣列 三維、四維...等多維陣列的建立方法與二維陣列類似, 將多個二維陣列組合起來, 便成為三維陣列, 四維陣列亦同。 例如:3 年 2 班 1 號同學的三維陣列名稱就是 $student[3][2][1];6 年 4 班 2 號同學的數學成績的四維陣列名稱可以是 $student[6][4][2][math], 依此類推。
4 - 3 使用常數 常數 (Constant) 的特點是『定義之後, 其值就不能變更』。 雖然在大部份的場合, 使用變數即可解決我們的問題。 但有些時候, 為避免不小心改到不應更改的變數值;或者想用文字代替特定的資料或數值, 讓程式讀起來更容易理解, 此時就可使用常數。
定義常數 定義常數時必須使用 define() 函式, 其語法如下: 常數的命名規則和變數類似, 只不過常數不需以 $ 符號為開頭, 且習慣上都會全部使用大寫英文來命名。
定義常數 常數的值一經定義後, 就不能再修改。 以下就是一個簡單的常數應用範例:
內建常數 為了方便程式撰寫, PHP 也提供許多內建的常數 (又稱為 "Magic constants")。
內建常數
內建常數 舉例來說, 前面的範例示範了定義圓周率常數, 然而在 PHP 中其實已定義了一個圓周率常數 M_PI (= 3.14159265359), 所以上述範例可直接取用:
4 - 4 運算子與運算式 認識運算式與運算子 寫程式不可或缺的一部份, 就是對資料進行各種處理的運算式 (Expression), 而運算式則是由運算子 (Operator) 與運算元 (Operand) 所構成。 其中, 運算子代表的是運算的種類 (或者說運算符號), 而運算元則是要運算的資料。 舉例來說: 上面的例子就是一個運算式, 其中『+』是運算子, 代表要進行加法運算, 而 $x 與 $y 則是參與加法運算的運算元。
運算子與運算式 算術運算子 在 PHP 中運算子可分為許多種, 我們先從一般人最熟悉的算術運算子開始介紹。
運算子與運算式 遞增 / 遞減運算子 承襲 C 語言的風格, PHP 也提供遞增 / 遞減運算元, 請參考下表:
運算子與運算式 例如: 串連運算子 串連運算子『.』會將字串進行串連, 組合為單一字串。例如:
運算子與運算式 比較運算子 比較運算子會比較兩邊的運算元, 然後將結果以布林值傳回:
運算子與運算式 邏輯運算子 邏輯運算子會取兩邊的布林值, 進行邏輯上的交集、聯集、互斥與否定運算, 然後將結果以布林值傳回。
運算子與運算式 各邏輯運算子的使用方法如下:
運算子與運算式 以下是邏輯運算的真值表:
== 和 === 以及 != 和 !== 的不同 關於 ==、!= 和 ===、!== 的差異要再特別說明一下! PHP 在必要時會自動做資料型別轉換, 以便進行處理, 舉例來說, 我們可以將整數、浮點數與『含數字』的字串做算術運算:
== 和 === 以及 != 和 !== 的不同 在 23 + $str 這個運算式中, $str 變數所存的字串 '100' 會自動被轉換成數字 100, 再與 23 相加得到 123。 而做 $money - 23 時, 則會取 $money 字串開頭的 99 來參與計算。 為了方便我們進行『值』的比較, 所以在使用 ==、!= 運算子時, PHP 也會視情況轉換運算元的資料型別, 以便進行比較, 所以會有如下的比較結果。
== 和 === 以及 != 和 !== 的不同 至於 != 和 !== 的差別也相同, 即前者不會比較資料型別, 但後者則會比較資料型別是否不同。
邏輯運算中的型別轉換 如果我們在邏輯運算使用數值、字串、變數或陣列時 (例如在流程控制中判斷變數是否為空值), 視情況 PHP 會將這些變數做型別轉換再進行比較。 此時各資料型別的變數會依如下的原則進行轉換: 就整數、浮點數而言, 當其值為 0 即會視為 false、其它數值都算是 true。
邏輯運算中的型別轉換 舉例來說, 若建立一個陣列 "$arr = array ('0', 1);" 則: 當字串為 '0'、空字串 (沒有內容的字串 ''), 即會被視為 false;其它字串都算是 true。 NULL、空陣列一律都是 false;有含元素的陣列則為 true。 舉例來說, 若建立一個陣列 "$arr = array ('0', 1);" 則:
運算子與運算式 指定運算子及複合運算子 指定運算子 (=) 我們已用過多次, 簡單的說, 其功能就是將右邊的運算元指定給左邊的運算元, 且必要時會改變變數的資料型別: 指定運算子也可與算術運算子、部分邏輯運算子及串連運算子結合成『複合運算子』。
運算子與運算式 運算子優先順序 當一個運算式內有多個運算時, 會依照下面的優先順序來決定運算的先後。
運算子與運算式
運算子與運算式 如果運算子的優先順序相同, 則依照其在運算式中的位置, 由左至右依序運算, 只有指定及複合運算子, 是由右往左。 此外, 可以使用小括號 () 來改變優先順序, 小括號 () 內的運算式會優先處理。
4 - 5 流程控制 條件控制 迴圈 If / else if / elseif / else switch while for break 與 continue fore ach
條件控制 條件控制就是依據某項條件, 來判斷程式要用執行那一個流程, 在 PHP 中可使用 if / else 和 switch 兩種條件控制指令。 其中 if / else 還可以延伸為 if / elseif / else 用法。 if / else:if / else 的功用, 在於決定是否要執行某段程式。其語法如下:
條件控制 其中 else 的部份, 若不需要可省略。 舉例來說, 要用 if 判斷買飲料時是否額外要求加珍珠、若要加珍珠要再收 5 元, 則可寫成: 以上是只針對條件運算式為 true 作處理的例子。
條件控制 如果 true 和 false 都要處理, 就需加上 else, 並在其大括號中加入 false 狀況要執行的程式片段。 例如依據氣溫判斷要穿什麼衣服, 用程式可寫成:
條件控制 如果要執行的指令只有一個, 則大括號可省略, 例如: if / elseif / else:如果在 else 下還要做條件判斷, 可使用 elseif 指令, 例如:
條件控制 我們可串接多個 elseif 以便依各種狀況做不同處理, 例如依考試分數判斷成績等第: switch:switch 類似於一連串的 if / elseif 結構。
條件控制 但在 if / elseif 結構中, 每個括弧中都可放不同的條件運算式;然而使用 switch 時就好比只針對一個值做比對。
條件控制 當 $i 的值等於某個 case 後的『條件值』時, 就會執行該段程式;如果都找不到符合的, 則會執行 default 段落的程式。 若找不到符合者便不執行任何程式, 則可省略 default 的部份。
條件控制 例如:
迴圈 迴圈 (Loop) 結構讓我們可處理重複性的工作, 迴圈的語法可分為 while、for、foreach 三種。 while:while 迴圈的結構很簡單, 語法如下: 當條件運算式為 true 時, 就會重複執行大括號中的程式碼。 while 迴圈還有一種用法, 適用於迴圈『至少要執行一次』的情況, 其語法如下。
迴圈 for:for 迴圈的語法比 while 複雜一點, 其語法如下:
迴圈 其中初始運算式只有第 1 次進入 for 迴圈之前會被執行;而條件運算式則和 while 一樣, 是用以判斷是否要繼續執行大括號的內容。 至於控制運算式則是每一輪迴圈執行結束後都會執行的。 例如前面輸出 1〜100 之間所有 3 的倍數、並計算總和的例子, 用 for 迴圈處理可寫成:
迴圈 break 與 continue:break 和 continue 都是迴圈內的跳躍指令, 表示可以忽略指令後方的程式。
迴圈 break 指令預設只能跳出一層迴圈, 因此如果要跳出多層的巢狀迴圈, 可在 break 後加上數字表示要跳出幾層的迴圈: fore ach:當需要針對陣列中每一個元素進行處理時, 我們可以使用 for 迴圈來取出元素。
迴圈 但為了讓這樣的工作更有效率, PHP 提供了另一個 foreach 迴圈, 可以更加方便地處理陣列。 foreach 會依序從 $arr 陣列中取得各元素值, 然後放在 $value 變數中。
迴圈 陣列中有多少個元素, foreach 迴圈就會執行幾次, 所以每一輪的迴圈中, $value 都代表不同的陣列元素。
迴圈 執行結果:
迴圈 上面 foreach 迴圈如果改用 for 迴圈來設計, 其程式碼如下: 兩相比較後可以看到, for 迴圈必須先取得陣列長度來定義迴圈, 然後迴圈內必須逐一使用索引數字存取各元素, 使用上不若 foreach 迴圈方便易用。
迴圈 foreach 迴圈的另一個用法, 則適合於在迴圈中需同時用到元素索引和元素值的場合, 其語法如下: $k、$v 都是自訂的變數名稱, foreach 會依序從 $arr 陣列中取得各元素的索引與值, 然後索引值放在 $k 變數, 元素值放在 $v 變數中。 所以在每一輪圈中, $k 就代表某個元素的索引, 而 $v 則是對應的元素值。
4 - 6 表單資料傳遞 在網頁程式中, 經常會需要讓使用者輸入、選擇相關項目, 然後由程式讀取並且進行處理。 前面 2-3 節已經說明如何建立可讓使用者輸入資料的表單, 本節將為您介紹如何在程式中, 讀取並且處理這些資料。
取得表單資料的方法 若要以 PHP 程式讀取使用者在表單中輸入的資料, 需在建立表單時, 將 <form> 標籤的 action 屬性指向 PHP 網頁。 如此使用者送出表單時, 瀏覽器就會將表單中輸入的資料送給該 PHP 網頁。 為方便我們存取這些資料, PHP 會將這些資料依 <form> 標籤的 method 屬性設定, 存於不同的內建變數 (內建變數都是陣列的形式) 中。
取得表單資料的方法 設為 method = "GET" 時, 在程式中可透過內建變數 $_GET 陣列取得表單資料。 設定 method = “POST” 時, 可透過內建變數 $_POST 陣列取得表單資料。
輸入資料應先檢查後再使用 程式直接將取得的資料用 echo 輸出, 其實這是不妥當的程式設計方式。 因為網頁放在網路上, 無法得知誰會來瀏覽、會輸入什麼樣的資料, 因此所有經由表單取得的資料, 都要先檢查其內容再使用。 一些原則像是: 檢查輸入資料的字元:例如是詢問年齡的欄位, 就要檢查是否輸入數字以外的資料。 檢查資料的長度:除非是用來張貼文章的欄位, 一般要讓使用者輸入的資料通常都只需幾個字
輸入資料應先檢查後再使用 從下一章開始會介紹 PHP 的各種相關函式, 讀者即可利用這些函式來檢查及處理使用者輸入的內容。 所以可依欄位的屬性, 檢查使用者是否輸入過多的資料, 因為過多的資料即意謂可能有駭客輸入了額外的資料, 試圖破解網站的安全漏洞等。 處理資料格式:有時程式需將資料顯示在網頁中或寫入資料庫, 為避免使用者惡意輸入不當資料, 使程式執行有不當的結果, 就需適切地處理資料再使用。 從下一章開始會介紹 PHP 的各種相關函式, 讀者即可利用這些函式來檢查及處理使用者輸入的內容。
取得表單中複選欄位的資料 2-18 頁曾經提到, 如果是『可以複選』的欄位, 像是可多選的固定選單 (<select multiple...>), 或是名稱相同的多選鈕 (<input type = "checkbox"..>), 其表單資料的傳送格式如下:
取得表單中複選欄位的資料 此時 PHP 內部將表單資料放進 $_GET 陣列時的步驟如下: 因為名稱相同, 後面的資料會覆蓋前面的資料, 所以我們讀取 $_GET['learning'] 時, 只能取得最後一筆欄位值。 為了解決這個問題, 在建立表單時, 可以將欄位名稱設定為陣列的形式。
取得表單中複選欄位的資料 或是 如此送出的表單資料, 以及與 PHP 內部將資料放進 $_GET 陣列的步驟如下。
取得表單中複選欄位的資料 所以我們就可以透過二維陣列 $_GET['learning'][0]、$_GET ['learning'][1]... 來讀取所有被選擇的項目了。
另一種取得表單資料的方法 - 設定 register_globals 除了使用 $_GET、$_POST 存取表單資料外, 如果將 php.ini 檔內的 register_globals 項目設定為 on, PHP 還可以直接以表單欄位做為變數名稱, 來取得該欄位的資料。 例如前面 Ch04-11.php 使用 $_POST['username'] 取得 username 欄位的欄位值。 如果開啟 register_globals 設定, 便可以直接使用 $username 讀取 username 欄位的值。
另一種取得表單資料的方法 - 設定 register_globals 我們無法精確地分清楚哪些是程式內部設定的變數, 哪些變數是外部來的資料, 甚至, 外部資料還有可能修改內部的變數值! 假設一個開啟 register_globals 的網站如下運作。
另一種取得表單資料的方法 - 設定 register_globals
另一種取得表單資料的方法 - 設定 register_globals 若上面檔案放置於 http://php.flag.com.tw/ 網站, 依照原本的設計, 使用者應該連線 http://php.flag.com.tw/a.php, 然後 a.php 才會引用並執行 b.php。 而 $config 變數在 a.php 中已經定義, 因此 b.php 並未先建立與設定其值, 便直接使用該變數。 include() 除了引用並執行本地伺服器的 PHP 檔案以外, 還可以引用遠端伺服器的 PHP 檔案。
另一種取得表單資料的方法 - 設定 register_globals 所以可能會有人特意不連線 a.php, 而以下面的方式直接連線 b.php: 使用上面方式連線後, b.php 就會依照惡意者給予的資料, 引入並執行遠端伺服器上的惡意程式。 所以為了安全起見, 建議不要啟用 register_globals 功能。
另一種取得表單資料的方法 - 設定 register_globals PHP 4.2.0 版之後, 也基於安全考量, 預設關閉 register_globals;而未來的 PHP6 也將完全取消此功能。 要查看網站的設定為何, 可使用 3-1 節介紹的 phpinfo() 輸出網站所有設定值。
關閉 register_globals 設定 由於 PHP 是在 4.2.0 之後, 才將 register_globals 預設為 off, 但在此之前, PHP 的使用已非常廣泛, 許多網頁都是以 register_globals = on 為前題而設計的。 因此目前仍有些提供網站空間服務的業者, 基於相容性需求, 會讓 register_globals 的設定為 on。
關閉 register_globals 設定 如果您所使用的網站空間服務, 也是使用『register_globals = on』的設定, 可透過 Apache 伺服器所提供的 .htaccess 檔修改個人網站的設定。 請在自己的網站目錄中放置名為 .htaccess 的檔案, 內容如下: 如此即可在您的網站下關閉 register_globals 設定。
小心 register_globals 開啟的環境 雖然我們撰寫與測試程式時都不啟用 register_globals 功能, 但是許多主機為了相容性, 管理者都會開啟 register_globals, 而且系統可能關閉 .htaccess 的權限, 無法自行關閉 register_globals。 所以最保險的方法是撰寫 PHP 程式時, 也要考慮如果程式被拿到開啟 register_globals 的主機執行時, 可能會遇到的危險, 例如上頁例子便是一個不良的程式寫作示範。
小心 register_globals 開啟的環境 為了避免內部變數被外部資料污染, 建議儘量不要在可能產生危險的指令 (如引入、開檔、存取資料庫等), 使用其他檔案定義的變數。 如果必須這麼做, 也應該先過濾或檢查變數值, 才能避免 register_globals 所造成的影響。
4 - 7 重要內建變數 PHP 除了有內建的常數外, 也有一組內建變數(Predefined Variables), 這些內建變數都是以字串為索引的陣列, 是程式一開始執行時即存在的。 不需事先定義, PHP 會自動將與程式相關的資料存於其中供我們取用。 上一節介紹的 $_GET、$_POST 便是內建變數, PHP 另外還有幾個實用的內建變數 (也都是陣列), 我們可以使用 phpinfo() 函式來取得內建變數的資訊。
重要內建變數
重要內建變數 後面章節中, 我們會於實際使用時, 分別為您介紹常用的內建變數。本節將先說明 $_SERVER 的功用。 例如剛才設計表單時, 我們會將 action 屬性指向處理表單的 PHP 程式, 但將檔名寫在 HTML 標籤中有個缺點:如果日後修改了檔案名稱, 我們也必須修改標籤中的屬性。
重要內建變數 如果希望不管怎樣修改檔名, 程式都不用修改, 就可善用 $_SERVER 內建變數。 $_SERVER 內建變數中有一個元素索引是 'PHP_SELF', 其元素值即為代表 PHP 程式本身的路徑。 因此如果表單要由本身來處理, 就可用 $_SERVER['PHP_SELF'] 的值當成表單 action 的屬性值。
重要內建變數 $_SERVER 陣列中的元素很多, 此處就不詳列, 請參考 PHP 官方網站上的文件說明 (http://tw.php.net/manual/tw/reserved.variables.php#reserved.variables.server)。