PHP強化之04 - 超全域性陣列
----- 最後更新【2018-12-6】-----
一、簡介
定義:超全域性變數是在全部作用域中始終可用的內建變數。
在PHP中超全域性變數一共有9種,它們分別是:$GLOBALS、$_SERVER、$_GET、$_POST、$_FILES、$_COOKIE、$_SESSION、$_REQUEST、$_ENV
二、超全域性變數
1、$GLOBALS
一個包含了全部變數的全域性組合陣列。變數的名字就是陣列的鍵。
使用var_dump($GLOBALS)列印,就可以看出$GLOBALS是一個包含了所有的一個全域性組合陣列。
array (size=9) '_GET' => array (size=1) 'aa' => string '12345' (length=5) '_POST' => array (size=0) empty '_COOKIE' => array (size=1) 'PHPSESSID' => string 'dscqcql91ap682d83oi80c3aj6' (length=26) '_FILES' => array (size=0) empty '_SESSION' => array (size=0) empty '_ENV' => array (size=0) empty '_REQUEST' => array (size=1) 'aa' => string '12345' (length=5) '_SERVER' => array (size=32) 'HTTP_HOST' => string '47. ... .116' (length=14) 'HTTP_CONNECTION' => string 'keep-alive' (length=10) ... ... 'REQUEST_TIME_FLOAT' => float 1544101407.738 'REQUEST_TIME' => int 1544101407 'GLOBALS' => &array<
2、$_SERVER
$_SERVER是一個包含了諸如頭資訊(header)、路徑(path)、以及指令碼位置(script locations)等等資訊的陣列。
$_SERVER包含的資訊比較多,這裡就幾個常見的拿出來講解一下。
1)SERVER_ADDR
當前執行指令碼所在的伺服器的 IP 地址。(私有ip?)
如:'SERVER_ADDR' => string '172. ... .20' (length=13)
2)SERVER_NAME
當前執行指令碼所在的伺服器的主機名。如果指令碼運行於虛擬主機中,該名稱是由那個虛擬主機所設定的值決定。(獲取域名或伺服器ip)
如:'SERVER_NAME' => string '47. ... .116' (length=14)
還可以使用函式gethostbyname()獲取伺服器ip。
3)SERVER_PORT
Web 伺服器使用的埠。預設值為 “80”。如果使用 SSL 安全連線,則這個值為使用者設定的 HTTP 埠。
如:'SERVER_PORT' => string '80' (length=2)
4)REQUEST_METHOD
訪問頁面使用的請求方法;例如,“GET”, “HEAD”,“POST”,“PUT”。
5)REQUEST_URI
URI 用來指定要訪問的頁面。(獲取當前域名的字尾,返回完整的路徑,包含引數)
如:'REQUEST_URI' => string '/demo12.php?aa=12345' (length=20)
6)QUERY_STRING
query string(查詢字串),如果有的話,通過它進行頁面訪問。
如:'QUERY_STRING' => string 'aa=12345' (length=8)
7)HTTP_ACCEPT
當前請求頭中 Accept: 項的內容,如果存在的話。
如:'HTTP_ACCEPT' => string 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' (length=74)
8)HTTP_HOST
當前請求頭中 Host: 項的內容,如果存在的話。(獲取域名或伺服器ip)
如:'HTTP_HOST' => string '47. ... .116' (length=14)
9)HTTP_REFERER
引導使用者代理到當前頁的前一頁的地址(如果存在)。由 user agent 設定決定。並不是所有的使用者代理都會設定該項,有的還提供了修改 HTTP_REFERER 的功能。簡言之,該值並不可信。
10)REMOTE_ADDR
瀏覽當前頁面的使用者的 IP 地址。(客戶端ip:有可能是使用者的IP,也可能是代理的IP)
如:'REMOTE_ADDR' => string '112.97.57.177' (length=13)
11)SCRIPT_NAME
包含當前指令碼的路徑。這在頁面需要指向自己時非常有用。__FILE__ 常量包含當前指令碼(例如包含檔案)的完整路徑和檔名。
如:'SCRIPT_NAME' => string '/demo12.php' (length=11)
12)SCRIPT_FILENAME
當前執行指令碼的絕對路徑。
如:'SCRIPT_FILENAME' => string '/var/www/html/demo12.php' (length=24)
更多的引數請檢視:http://php.net/manual/zh/reserved.variables.server.php
3、$_GET
通過 URL 引數傳遞給當前指令碼的變數的陣列。
4、$_POST
預定義的 $_POST 變數用於收集來自 method=“post” 的表單中的值。
當 HTTP POST 請求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data 時,會將變數以關聯陣列形式傳入當前指令碼。
從帶有 POST 方法的表單傳送的資訊,對任何人都是不可見的(不會顯示在瀏覽器的位址列),並且對傳送資訊的量也沒有限制。
註釋:然而,預設情況下,POST 方法的傳送資訊的量最大值為 8 MB(可通過設定 php.ini 檔案中的 post_max_size 進行更改)。
5、$_FILES
通過 HTTP POST 方式上傳到當前指令碼的專案的陣列。
$_FILES是一個二維陣列,其內容主要有以下五項:
1)$_FILES[“userfile”][“error”]
error總共有5個不同的返回值,其中0表示成功,另外4個表示在嘗試中出現錯誤。
- 0(UPLOAD_ERR_OK):沒有錯誤發生,檔案上傳成功。
- 1(UPLOAD_ERR_INI_SIZE):上傳的檔案超過了 php.ini 中upload_max_filesize 選項限制的值。
- 2(UPLOAD_ERR_FORM_SIZE):上傳檔案的大小超過了 HTML 表單中MAX_FILE_SIZE 選項指定的值。
- 3(UPLOAD_ERR_PARTIAL):檔案只有部分被上傳。
- 4(UPLOAD_ERR_NO_FILE):沒有檔案被上傳。
- 5:上傳檔案大小為0。
2)$_FILES[“userfile”][“name”]
name表示客戶端機器上宣告的檔案最初的名字,包括副檔名。因此,如果瀏覽器一個名為test.png的檔案,並通過表單上傳,則此變數的值將是test.png。
3)$_FILES[“userfile”][“size”]
size指定從客戶端上傳的檔案的大小,以位元組為單位。因此,在test.png檔案的例子中,此函式可能賦值為5253,大約為5kb.
4)$_FILES[“userfile”][“tmp_name”]
tmp_name指定上傳到伺服器後為檔案賦予的臨時名。這是儲存在臨時目錄(由PHP指令upload_tmp_dir指定)中時所指定的檔名。
5)$_FILES[“userfile”][“type”]
type指定從客戶端上傳的檔案的mime型別。因此,在test.png檔案的例子中,此變數會賦值為image/png。如果上傳的是PDF,則賦值為application/pdf。因為這個變數有時會得到意外的結果,所以應當在指令碼中顯示地進行驗證。
6、$_COOKIE
通過 HTTP Cookies 方式傳遞給當前指令碼的變數的陣列。
7、$_SESSION
當前指令碼可用 SESSION 變數的陣列。
8、$_REQUEST
預設情況下包含了 $_GET,$_POST 和 $_COOKIE 的陣列。由於安全的問題,建議儘量避免使用$_REQUEST。
9、$_ENV
通過環境方式傳遞給當前指令碼的變數的陣列。
這些變數被從 PHP 解析器的執行環境匯入到 PHP 的全域性名稱空間。很多是由支援 PHP 執行的 Shell 提供的,並且不同的系統很可能執行著不同種類的 Shell,所以不可能有一份確定的列表。請檢視你的 Shell 文件來獲取定義的環境變數列表。
其他環境變數包含了 CGI 變數,而不管 PHP 是以伺服器模組還是 CGI 處理器的方式執行。
三、經典案例
1、用php寫出顯示客戶端ip與伺服器ip的程式碼
$_SERVER["REMOTE_ADDR"]
$_SERVER["SERVER_ADDR"]
2、獲取當前頁面的完整URL
echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
//Or:
echo 'http://'.$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
//Or
echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'];
//若不確定是http還是https,還可以寫成如下形式:
echo $_SERVER['REQUEST_SCHEME']."//".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
參考
官方手冊:http://www.php.net/manual/zh/language.variables.superglobals.php