ARES資通電子報

技術交流

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 等等,請有興趣的朋友可以多加查詢。