技術交流

PHP5 預定義變數 Super Global Variables

更新於

從 PHP4.10 版本之後,正式引入了超全域變數(Super Global Variable)。

為什麼叫超全域變數呢?因為在 PHP 程式中是有全域變數的,雖然是全域變數,但是在使用時還是要使用相關的關鍵字才能調用,而這次我們討論的超全域變數不需要和全域變數一樣使用相關語法才能調用。它可以在程式中的任何位置直接調用。下面就來看一下 PHP5 中有哪些超全域變數。

設定

在介紹超全域變數之前,我們先瞭解一下有關 PHP 設定檔(php.ini)中 global variables 的設定。

預設後面我們講的 super global variables 都是有效的,除非你修改了php.ini 中 variables_order 的值。

設定 EGPCS(Environment,GET,POST,Cookie,Server)變數解析的順序。默認設定為 EGPCS。舉例說,將其設為 GP,會導致 PHP 完全忽略環境變數,cookies 和 server 變數,並用 GET 方法的變數覆蓋 POST 方法的同名變數。

注意:超全域變數是不能作為可變變數用在 function 或是 class 之中。

超全域變數 $GLOBALS

$GLOBALS 會 reference所有在全域變數範圍內的全域變數。它是以一個關聯陣列。也就是說,它有可能是一維也可能是多維的陣列,視程式中 global variables 的資料類型。

假設程式中只有一個 global 變數是 $g_aa = "Test",用 $GLOBALS來訪問這個變數的寫法就是 $GLOBALS["g_aa"],此時是一維陣列。

假設程式中只有一個global 變數是 $g_arr = array("test","demo"), 用 $GLOBALS 來訪問這個 $g_arr 的寫法:$GLOBALS["g_arr"],此時就是二維陣列。下面來看一個 $GLOBALS 的代碼範例:


function test() {
$name = ‘localname’;
echo ‘Local Var is->’.$name.’
Global Var is->’.$GLOBALS[‘name’]; } $name = "globalname"; test(); // will output //Local Var is->localname //Global Var is->globalname

對於global 變數,除了用 $GLOBALS super global variable 外,還可以用global” 關鍵字來調用 global 變數。上面的例子可以換成下面這樣:


function test() {
global $name;
$name1 = ‘localname’; // 注意这个地方要换名称,否则这里视为重写 global 变量的值.
echo ‘Local Var is->’.$name1.’
Global Var is->’.$name; } $name = "globalname"; test();

如果要查看 $GLOBALS 中有哪些值,可以用 var_dump($GLOBALS);或是 print_r($GLOBALS)。

$_SERVER

$_SERVER Super global變數包含了 Web Server 和執行環境的相關資訊。它是由 Web Server 自動產生。不同的 Web Server(如Apache, IIS 等等) 產生出來的資訊可能有所不同。

$_SERVER 提供的 Web Server 的相關資訊及運行環境資訊非常多,這裡就不做一一介紹了。

注意:此變數也是從 PHP 4.10 之後引入,之前是 $HTTP_SERVER_VARS (此變數不是超全域變數),PHP5現已廢止不再使用。調用時,index 要大寫。

$_GET

$_GET HTTP GET 變數,也即 HTML 中的 form 的 method 為 get 時,submit form 時產生的變數。

$_POST

$_POST HTTP POST 變數,也即 HTML 中的 form 的 method 為 POST 時,submit form 時產生的變數。

$_FILES

$_FILE 在上傳檔時產生。注意上傳文件的 form 的 method 請設為 POST。 有關 $_FILES 裡的內容,請參考如下:

  • $_FILES["userfile"]["name"] :用戶端機器文件的原名稱。
  • $_FILES["userfile"]["type"]:檔的 MIME 類型,如果流覽器提供此資訊的話。一個例子是“image/gif”。不過此 MIME 類型在 PHP 端並不檢查,因此不要想當然認為有這個值。
  • $_FILES["userfile"]["size"]:已上傳檔的大小,單位為位元組。
  • $_FILES["userfile"]["tmp_name"] :檔被上傳後在服務端儲存的暫存檔案名。
  • $_FILES["userfile"]["error"] :和該檔上傳相關的錯誤代碼。此項目是在 PHP 4.2.0 版本中增加的。

$_REQUEST

$_REQUEST HTTP Request 變數,包括 $_GET、$_POST、$_COOKIE 三個 Super Global變數的內容。

$_SESSION 會話變數

上面所講的這些 Super Global Variables 中,在我們實際程式撰寫時,最常用到的可能就是會話變數了。

我們知道 HTTP 協定是無狀態的通信,但是在實際應用中,我們需要保存上下文的有狀態或某些資料,比如在某一個頁面記錄當前User 的一些資訊,當 User 切換到其他頁面時,我們還需要這些資訊。比如:我們的應用程式每一頁都需要驗證使用者的 password,我們不可能讓 User 在每個頁面都輸入,所以我們在 User Login時把 User 的Password 存放在 Session 中,當 User 切換到其他頁面時,我們到 Session中去做驗證。

$_SESSION 變數在使用之前需要手動的初始化(除非在 php.ini 中設定了session.auto_start = 1),初始化的方法是調用 sesson_start()。

限於篇幅,其它 Super Global 變數如:$_ENV,$_COOKIE 等等,請有興趣的朋友可以多加查詢。

閱讀更多