PHP5 預定義變數 – Super Global Variables
文 - Dennis
引言
從PHP4.10 版本之後,正式引入了超全域變數(Super Global Variable)。
為什麼叫超全域變數呢?因為在 PHP 程式中是有全域變數的,雖然是全域變數,但是在使用時還是要使用相關的關鍵字才能調用到,而這次我們討論的超全域變數不需要和全域變數那樣,使用相關語法才能調用。它可以在程式中的任何位置(class 內, function 內)都可以直接調用。下面就來看一下 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 方法的同名變數。” - 摘自 PHP官方手冊
注意:
超全域變數是不能作為可變變數用在 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 的代碼範例:
| Example #1 $GLOBALS example <?php function test() { $name = ‘localname’; echo ‘Local Var is->’.$name.’<br/>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 變數。上面的例子可以換成下面這樣:
| Example #2 global example <?php function test() { global $name; $name1 = ‘localname’; // 注意这个地方要换名称,否则这里视为重写 global 变量的值. echo ‘Local Var is->’.$name1.’<br/>Global Var is->’.$name; } $name = "globalname"; test(); // will output //Local Var is->localname //Global Var is->globalname ?> |
如果要查看 $GLOBALS 中有哪些值,可以用 var_dump($GLOBALS);或是 print_r($GLOBALS);
$_SERVER
$_SERVER Super global變數包含了 Web Server 和執行環境的相關資訊。它是由 Web Server 自動產生。不同的 Web Server(如Apache, IIS 等等) 產生出來的資訊可能有所不同。
$_SERVER 提供的 Web Server 的相關資訊及運行環境資訊非常多,這裡就不做一一介紹了。常用的如:
$_SERVER[‘PHP_SELF’]:當前運行的script name
$_SERVER[‘SERVER_NAME’]:當前 Web Server的名稱
$_SERVER[‘SERVER_ADDR’]:當前Web Server的IP
$_SERVER[‘REMOTE_HOST’]:當前流覽本頁面的 client 的名稱
$_SERVER[‘REMOTE_ADDR’]:當前流覽本頁面的 client 的IP
注意:
此變數也是從 PHP 4.10 之後引入,之前是 $HTTP_SERVER_VARS (此變數不是超全域變數),PHP5現已廢止不再使用。調用時,index 要大寫。
$_GET
$_GET HTTP GET 變數,也即 HTML 中的 form 的 method 為 get 時,submit form 時產生的變數。
如下代碼:
| Example #3 $_GET example // get.html <html> <header> <title>Get Sample</title> </header> <body> <form name=’form1’ method=’GET’ action=’get_test.php’> <input type=’text’ name=’emp_id’/> <input type=’text’ name=’emp_name’/> <input type=’submit’ name=’Submit’/> </form> </body> </html> // get_test.php <?php function test() { echo $_GET[‘emp_id’]; echo $_GET[‘emp_name’]; } test(); ?> |
$_POST
$_POST HTTP POST 變數,也即 HTML 中的 form 的 method 為 POST 時,submit form 時產生的變數。
如下代碼:
| Example #4 $_POST example // Post.html <html> <header> <title>Post Sample</title> </header> <body> <form name=’form1’ method=’POST’ action=’post_test.php’> <input type=’text’ name=’emp_id’/> <input type=’text’ name=’emp_name’/> <input type=’submit’ name=’Submit’/> </form> </body> </html> // post_test.php <?php function test() { echo $_POST[‘emp_id’]; echo $_POST[‘emp_name’]; } test(); ?> |
$_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
$_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();
$_SESSION 也是以陣列的形式存在,在下面的代碼,讓我們來看一下如何用 $_SESSION:
| Example #5 $_SESSION example // s1.php <?php session_start();// Session Start 之前请不要有任何的输出,那怕是空白 $_SESSION[‘passwd’] = ‘%^#^#Xq#’; ?> // s2.php <?php session_start(); echo $_SESSION[‘passwd’]; ?> |
限於篇幅,其它 Super Global 變數如:$_ENV,$_COOKIE 等等,請有興趣的朋友可以多加查詢。
資通電子報之所有文字及圖片為資通電腦(股)公司版權所有。
© Copyright Ares International Corporation. 2006-2009, All Rights Reserved.
還有更多資訊在本公司的網站上,歡迎參觀 網址:http://www.ares.com.tw