Forum und email

預設的變數

PHP 為它執行的程式提供了大量的預設變數。然而,由于有許多變數因依賴其所執行的伺服器種類、版本、安裝等情況而定,因此難以有完整的被記載下來。更有一些變數在指令行的模式運行時是不能使用的。有關這些變數的列表,請參考保留的先前定義變數一節。

Warning

PHP 4.2.0 以後的版本,register_globals 指令的預設值是 off。這是一個重大的改變。將 register_globals 的值預設為 off 會影響到預設變數在全域範圍內的有效性。例如,要得到 DOCUMENT_ROOT 的值,應使用 $_SERVER['DOCUMENT_ROOT'] 而不是 $DOCUMENT_ROOT、使用 $_GET['id'] 以取得 URL https://www.example.com/test.php?id=3 中 id 的值,而不是用 $id、或使用 $_ENV['HOME'] 來取代 $HOME

更多與此更改相關的資料可在 register_globals 的設置一節、使用 Register Globals 中的安全章,或在 » 4.1.0» 4.2.0 的發行通告中取得。

我們建議您使用 PHP 提供的保留預設變數,如 superglobal 陳列

自 4.1.0 版本起,PHP 額外提供了一套預設陣列,當中包含了來自伺服器〈如適用〉、環境、及使用者輸入的變數。這些新陳列比較特別,因此它們會自動地設為全域,即可以在所有範圍內使用。正因如此,它們也被稱為 'autoglobals' 或 'superglobals'。〈PHP 尚未有使用者自行定義 superglobals 的功能。〉我們將在下面列出 superglobals,但要知道它們的內容和 PHP 預設變數的深入討論,請參考保留的先前定義變數一節。此外,您也會留意舊有的預設變數 ($HTTP_*_VARS) 仍然存在。 由 PHP 5.0.0 開始,較長的 PHP 先前定義的變數陳列可以通過設定 register_long_arrays 來關閉。

Note: 可變變數 Superglobals 不能當作可變變數來使用。

如果某些 variables_order 中的變數沒有被設定,它們相對的 PHP 預設陳列也將會是空的。

PHP 的 Superglobals
$GLOBALS
包含一個指向程式全域範圍內可用變數的索引。此陳列的索引鍵為全域變數的名稱。$GLOBALS 自 PHP 3 開始就已存在。
$_SERVER
由網頁伺服器設定的變數或目前的程式所執行的環境產生的變數。其性質類似舊有的 $HTTP_SERVER_VARS 陳列,雖然目前還可以使用,但不被建議。
$_GET
通過 HTTP GET 提供給程式的變數。其性質類似舊有的 $HTTP_GET_VARS 陳列,雖然目前還可以使用,但不被建議。
$_POST
通過 HTTP POST 提供給程式的變數。其性質類似舊有的 $HTTP_POST_VARS陳列,雖然目前還可以使用,但不被建議。
$_COOKIE
通過 HTTP cookies 提供給程式的變數。其性質類似舊有的 $HTTP_COOKIE_VARS陳列,雖然目前還可以使用,但不被建議。
$_FILES
通過 HTTP POST 檔案上傳提供給程式的變數。其性質類似舊有的 $HTTP_POST_FILES陳列,雖然目前還可以使用,但不被建議。詳情請參閱 POST 上傳方式
$_ENV
執行環境提供給程式的變數。其性質類似舊有的 $HTTP_ENV_VARS陳列,雖然目前還可以使用,但不被建議。
$_REQUEST
通過 GET,POST 和 COOKIE 輸入方式提供給程式的變數、也正因如此,不值得信任。此陳列中變數的存在與否及次序是決定於 variables_order 的設定。PHP 4.1.0 之前的版本並沒有類似此陳列的變數。請同時參閱 import_request_variables()
Caution

由 PHP 4.3.0 版開始,$_REQUEST 陳列已不再含有 FILE 的資訊。

Note: 指令行模式下執行時,它並包含 argvargc 項目。此兩項目只在 $_SERVER 陳列中出現。

$_SESSION
目前和程式注冊了的 session 變數。其性質類似舊有的 $HTTP_SESSION_VARS陳列,雖然目前還可以使用,但不被建議。詳情請參閱 Session 處理函數一節。