PHP預(yù)定義變量是在腳本執(zhí)行之前就已經(jīng)定義好的變量,可以直接在腳本中使用。這些變量提供了與服務(wù)器和環(huán)境相關(guān)的信息,以及與用戶交互的輸入數(shù)據(jù)。了解PHP預(yù)定義變量對于編寫高效和可靠的PHP代碼非常重要。本教程將介紹一些常見的PHP超全局變量及其用法。
一、超全局變量
超全局變量 — 在全部作用域中始終可用的內(nèi)置變量
PHP 中的許多預(yù)定義變量都是“超全局的”,這意味著它們在一個(gè)腳本的全部作用域中都可用。在函數(shù)或方法中無需執(zhí)行 global $variable; 就可以訪問它們。
這些超全局變量是:
- $GLOBALS
- $_SERVER
- $_GET
- $_POST
- $_FILES
- $_COOKIE
- $_SESSION
- $_REQUEST
- $_ENV
二、$GLOBALS
$GLOBALS — 引用全局作用域中可用的全部變量。關(guān)聯(lián)數(shù)組 array,包含當(dāng)前腳本內(nèi)定義成全局范圍的所有變量的引用。 數(shù)組的鍵就是變量的名字。
1、用法
<?php function test() { $foo = "local variable"; echo '$foo in global scope: ' . $GLOBALS["foo"] . "\n"; echo '$foo in current scope: ' . $foo . "\n"; } $foo = "Example content"; test(); ?>
以上示例的輸出類似于:
$foo in global scope: Example content $foo in current scope: local variable
注意:從 PHP 8.1.0 起,不再支持對整個(gè) $GLOBALS 數(shù)組的寫訪問:
寫入整個(gè) $GLOBALS 將會(huì)導(dǎo)致錯(cuò)誤:
<?php // 生成編譯時(shí)錯(cuò)誤: $GLOBALS = []; $GLOBALS += []; $GLOBALS =& $x; $x =& $GLOBALS; unset($GLOBALS); array_pop($GLOBALS); // ...以及對 $GLOBALS 的任何其他寫入/讀寫操作 ?>
2、注釋
Superglobal”也稱為自動(dòng)化的全局變量。這就表示其在腳本的所有作用域中都是可用的。不需要在函數(shù)或方法中用 global $variable; 來訪問它。與所有其他超全局變量不同,$GLOBALS在PHP中總是可用的。
從 PHP 8.1.0 起, $GLOBALS 現(xiàn)在是全局符號表的只讀副本。 也就是說,全局變量不能通過副本進(jìn)行修改。 在之前的版本中,$GLOBALS 數(shù)組和 PHP 數(shù)組通常傳值的行為不一樣,全局變量可通過副本修改。
<?php // PHP 8.1.0 之前 $a = 1; $globals = $GLOBALS; // 表面意義的按值復(fù)制 $globals['a'] = 2; var_dump($a); // int(2) // 從 PHP 8.1.0 起 // 這不再修改 $a。先前的行為違反了按值語義。 $globals = $GLOBALS; $globals['a'] = 1; // 要恢復(fù)以前的行為,請迭代其副本并將每個(gè)屬性分配回 $GLOBALS。 foreach ($globals as $key => $value) { $GLOBALS[$key] = $value; } ?>
三、$_?SERVER
$_SERVER — 服務(wù)器和執(zhí)行環(huán)境信息。
$_SERVER 是一個(gè)包含了諸如頭信息(header)、路徑(path)、以及腳本位置(script locations)等信息的 array。這個(gè)數(shù)組中的條目由 Web 服務(wù)器創(chuàng)建,所以不能保證每個(gè) Web 服務(wù)器都提供全部條目;服務(wù)器可能會(huì)忽略一些,或者提供此處沒有列舉出來的其它內(nèi)容。然而,大部分變量在 ? CGI 1.1 規(guī)范中都有說明,并且很可能會(huì)定義。
注意: 當(dāng)在命令行運(yùn)行 PHP 時(shí),這些條目都將無效或者沒有任何意義。
除了下面列出的元素之外,PHP 還將使用請求報(bào)頭中的值創(chuàng)建其它元素,這些條目將命名為 HTTP_ 后跟報(bào)頭名稱,大寫且使用下劃線而不是連字符。例如 Accept-Language 報(bào)頭將作為 $_SERVER[‘HTTP_ACCEPT_LANGUAGE’] 提供。
1、目錄
- ‘PHP_SELF’:當(dāng)前執(zhí)行腳本的文件名,與 document root 有關(guān)。例如,在地址為 http://example.com/foo/bar.php 的腳本中使用 $_SERVER[‘PHP_SELF’] 將得到 /foo/bar.php。__FILE__ 常量包含當(dāng)前(例如包含)文件的完整路徑和文件名。 如果 PHP 以命令行模式運(yùn)行,這個(gè)變量將包含腳本名。
- ‘argv’:傳遞給該腳本的參數(shù)的數(shù)組。當(dāng)腳本以命令行方式運(yùn)行時(shí),argv 變量傳遞給程序 C 語言樣式的命令行參數(shù)。當(dāng)通過 GET 方式調(diào)用時(shí),該變量包含query string。
- ‘argc’:包含命令行模式下傳遞給該腳本的參數(shù)的數(shù)目(如果運(yùn)行在命令行模式下)。
- ‘GATEWAY_INTERFACE’:服務(wù)器使用的 CGI 規(guī)范的版本;例如,’CGI/1.1’。
- ‘SERVER_ADDR’:當(dāng)前運(yùn)行腳本所在的服務(wù)器的 IP 地址。
- ‘SERVER_NAME’:當(dāng)前運(yùn)行腳本所在的服務(wù)器的主機(jī)名。如果腳本運(yùn)行于虛擬主機(jī)中,該名稱是由那個(gè)虛擬主機(jī)所設(shè)置的值決定。
- 注意:在 Apache 2 里,必須設(shè)置 UseCanonicalName = On 和 ServerName。否則該值會(huì)由客戶端提供,就有可能被偽造。上下文有安全性要求的環(huán)境里,不應(yīng)該依賴此值。
- ‘SERVER_SOFTWARE’:服務(wù)器標(biāo)識字符串,在響應(yīng)請求時(shí)的頭信息中給出。
- ‘SERVER_PROTOCOL’:請求頁面時(shí)通信協(xié)議的名稱和版本。例如,’HTTP/1.0’。
- ‘REQUEST_METHOD’:訪問頁面使用的請求方法;例如,’GET’、’HEAD’、’POST’、’PUT’。
注意:
如果請求方法為 HEAD,PHP 腳本將在發(fā)送 Header 頭信息之后終止(這意味著在產(chǎn)生任何輸出后,不再有輸出緩沖)。
- ‘REQUEST_TIME’:請求開始時(shí)的時(shí)間戳。
- ‘REQUEST_TIME_FLOAT’:請求開始時(shí)的時(shí)間戳,微秒級別的精準(zhǔn)度。
- ‘QUERY_STRING’:query string(查詢字符串),如果有的話,通過它進(jìn)行頁面訪問。
- ‘DOCUMENT_ROOT’:當(dāng)前運(yùn)行腳本所在的文檔根目錄。在服務(wù)器配置文件中定義。
- ‘HTTPS’:如果腳本是通過 HTTPS 協(xié)議被訪問,則被設(shè)為一個(gè)非空的值。
- ‘REMOTE_ADDR’:瀏覽當(dāng)前頁面的用戶的 IP 地址。
- ‘REMOTE_HOST’:瀏覽當(dāng)前頁面的用戶的主機(jī)名。DNS 反向解析不依賴于用戶的 REMOTE_ADDR。
注意:必須配置 Web 服務(wù)器以創(chuàng)建這個(gè)變量。例如在 Apache 中,HostnameLookups On 必須在 httpd.conf 中設(shè)置才能存在。
- ‘REMOTE_PORT’:用戶機(jī)器上連接到 Web 服務(wù)器所使用的端口號。
- ‘REMOTE_USER’:經(jīng)驗(yàn)證的用戶
- ‘REDIRECT_REMOTE_USER’:驗(yàn)證的用戶,如果請求已在內(nèi)部重定向。
- ‘SCRIPT_FILENAME’:當(dāng)前執(zhí)行腳本的絕對路徑。
注意:
如果在命令行界面(Command Line Interface, CLI)使用相對路徑執(zhí)行腳本,例如 file.php 或 ../file.php,那么 $_SERVER[‘SCRIPT_FILENAME’] 將包含用戶指定的相對路徑。
- ‘SERVER_ADMIN’:該值指明了 Apache 服務(wù)器配置文件中的 SERVER_ADMIN 參數(shù)。如果腳本運(yùn)行在一個(gè)虛擬主機(jī)上,則該值是那個(gè)虛擬主機(jī)的值。
- ‘SERVER_PORT’:Web 服務(wù)器使用的端口。默認(rèn)值為 ’80’。如果使用 SSL 安全連接,則這個(gè)值為用戶設(shè)置的 HTTP 端口。
注意: 在 Apache 2 里,為了獲取真實(shí)物理端口,必須設(shè)置 UseCanonicalName = On 以及 UseCanonicalPhysicalPort = On,否則可能偽造此值,不一定會(huì)返回真實(shí)端口值。 上下文有安全性要求的環(huán)境里,不應(yīng)該依賴此值。
- ‘SERVER_SIGNATURE’:包含了服務(wù)器版本和虛擬主機(jī)名的字符串。
- ‘PATH_TRANSLATED’:當(dāng)前腳本所在文件系統(tǒng)(非文檔根目錄)的基本路徑。這是在服務(wù)器進(jìn)行虛擬到真實(shí)路徑的映像后的結(jié)果。
注意: Apache 2 用戶可以在 httpd.conf 中設(shè)置 AcceptPathInfo = On 來定義 PATH_INFO。
- ‘SCRIPT_NAME’:包含當(dāng)前腳本的路徑。這在頁面需要指向自己時(shí)非常有用。__FILE__ 常量包含當(dāng)前腳本(例如包含文件)的完整路徑和文件名。:’REQUEST_URI’
URI 用來指定要訪問的頁面。例如 “/index.html”。 - ‘PHP_AUTH_DIGEST’:當(dāng)作為 Apache 模塊運(yùn)行時(shí),進(jìn)行 HTTP Digest 認(rèn)證的過程中,此變量被設(shè)置成客戶端發(fā)送的“Authorization” HTTP 頭內(nèi)容(以便作進(jìn)一步的認(rèn)證操作)。
- ‘PHP_AUTH_USER’:當(dāng) PHP 運(yùn)行在 Apache 或 IIS(PHP 5 是 ISAPI)模塊方式下,并且正在使用 HTTP 認(rèn)證功能,這個(gè)變量便是用戶輸入的用戶名。
- ‘PHP_AUTH_PW’:當(dāng) PHP 運(yùn)行在 Apache 或 IIS(PHP 5 是 ISAPI)模塊方式下,并且正在使用 HTTP 認(rèn)證功能,這個(gè)變量便是用戶輸入的密碼。
- ‘AUTH_TYPE’:當(dāng) PHP 運(yùn)行在 Apache 模塊方式下,并且正在使用 HTTP 認(rèn)證功能,這個(gè)變量便是認(rèn)證的類型。
- ‘PATH_INFO’:如果存在的話,包含由客戶端提供的、跟在真實(shí)腳本名稱之后并且在查詢字符串之前的路徑信息。例如,如果當(dāng)前腳本是通過 URI http://www.example.com/php/path_info.php/some/stuff?foo=bar 訪問,那么 $_SERVER[‘PATH_INFO’] 將包含 /some/stuff。
- ‘ORIG_PATH_INFO’:在被 PHP 處理之前,“PATH_INFO” 的原始版本。
2、示例
$_SERVER 范例:
<?php echo $_SERVER['SERVER_NAME']; ?>
以上示例的輸出類似于:
www.example.com
3、注釋
“Superglobal”也稱為自動(dòng)化的全局變量。這就表示其在腳本的所有作用域中都是可用的。不需要在函數(shù)或方法中用 global $variable; 來訪問它。
四、$_?GET
$_GET — HTTP GET 變量。通過 URL 參數(shù)(又叫 query string)傳遞給當(dāng)前腳本的變量的數(shù)組。 注意:該數(shù)組不僅僅對 method 為 GET 的請求生效,而是會(huì)針對所有帶 query string 的請求。
$_GET 范例:
<?php echo 'Hello ' . htmlspecialchars($_GET["name"]) . '!'; ?>
假設(shè)用戶訪問的是 http://example.com/?name=Hannes
以上示例的輸出類似于:
Hello Hannes!
注意:
“Superglobal”也稱為自動(dòng)化的全局變量。這就表示其在腳本的所有作用域中都是可用的。不需要在函數(shù)或方法中用 global $variable; 來訪問它;
GET 是通過 urldecode() 傳遞的。
五、$_?POST
$_POST — HTTP POST 變量。當(dāng) HTTP POST 請求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data 時(shí),會(huì)將變量以關(guān)聯(lián)數(shù)組形式傳入當(dāng)前腳本。
$_POST 范例:
<?php echo 'Hello ' . htmlspecialchars($_POST["name"]) . '!'; ?>
假設(shè)用戶通過 HTTP POST 方式傳遞了參數(shù) name=Hannes
以上示例的輸出類似于:
Hello Hannes!
注意:“Superglobal”也稱為自動(dòng)化的全局變量。這就表示其在腳本的所有作用域中都是可用的。不需要在函數(shù)或方法中用 global $variable; 來訪問它。
六、$_?FILES
$_FILES — HTTP 文件上傳變量。通過 HTTP POST 方式上傳到當(dāng)前腳本的項(xiàng)目的數(shù)組。
注意:“Superglobal”也稱為自動(dòng)化的全局變量。這就表示其在腳本的所有作用域中都是可用的。不需要在函數(shù)或方法中用 global $variable; 來訪問它。
七、$_?REQUEST
$_REQUEST — HTTP Request 變量。默認(rèn)情況下包含了 $_GET,$_POST 和 $_COOKIE 的數(shù)組。
注意:
- “Superglobal”也稱為自動(dòng)化的全局變量。這就表示其在腳本的所有作用域中都是可用的。不需要在函數(shù)或方法中用 global $variable; 來訪問它;
- 以命令行方式運(yùn)行時(shí),將不包含 argv 和 argc 信息;它們將存在于 $_SERVER 數(shù)組;
- 由于 $_REQUEST 中的變量通過 GET,POST 和 COOKIE 輸入機(jī)制傳遞給腳本文件,因此可以被遠(yuǎn)程用戶篡改而并不可信。這個(gè)數(shù)組的項(xiàng)目及其順序依賴于 PHP 的 request_order 和 variables_order 指令的配置。
八、$_?SESSION
$_SESSION — Session 變量。當(dāng)前腳本可用 SESSION 變量的數(shù)組。
注意:“Superglobal”也稱為自動(dòng)化的全局變量。這就表示其在腳本的所有作用域中都是可用的。不需要在函數(shù)或方法中用 global $variable; 來訪問它。
九、$_?ENV
$_ENV — 環(huán)境變量。通過環(huán)境方式傳遞給當(dāng)前腳本的變量的數(shù)組。
這些變量被從 PHP 解析器的運(yùn)行環(huán)境導(dǎo)入到 PHP 的全局命名空間。很多是由支持 PHP 運(yùn)行的 Shell 提供的,并且不同的系統(tǒng)很可能運(yùn)行著不同種類的 Shell,所以不可能有一份確定的列表。請查看你的 Shell 文檔來獲取定義的環(huán)境變量列表。
其他環(huán)境變量包含了 CGI 變量,而不管 PHP 是以服務(wù)器模塊還是 CGI 處理器的方式運(yùn)行。
$_ENV 范例:
<?php echo 'My username is ' .$_ENV["USER"] . '!'; ?>
假設(shè) “bjori” 運(yùn)行此段腳本
以上示例的輸出類似于:
My username is bjori!
注意:“Superglobal”也稱為自動(dòng)化的全局變量。這就表示其在腳本的所有作用域中都是可用的。不需要在函數(shù)或方法中用 global $variable; 來訪問它。
十、$_?COOKIE
$_COOKIE — HTTP Cookies。通過 HTTP Cookies 方式傳遞給當(dāng)前腳本的變量的數(shù)組
$_COOKIE 范例:
<?php echo 'Hello ' . htmlspecialchars($_COOKIE["name"]) . '!'; ?>
假設(shè)之前發(fā)送了 “name” Cookie
以上示例的輸出類似于:
Hello Hannes!
注意:“Superglobal”也稱為自動(dòng)化的全局變量。這就表示其在腳本的所有作用域中都是可用的。不需要在函數(shù)或方法中用 global $variable; 來訪問它。
十一、$http_?response_?header
$http_response_header — HTTP 響應(yīng)頭。$http_response_header 數(shù)組與 get_headers() 函數(shù)類似。當(dāng)使用HTTP 包裝器時(shí),$http_response_header 將會(huì)被 HTTP 響應(yīng)頭信息填充。$http_response_header 將被創(chuàng)建于局部作用域中。
$http_response_header 范例:
<?php function get_contents() { file_get_contents("http://example.com"); var_dump($http_response_header); // 變量在本地作用域中填充 } get_contents(); var_dump($http_response_header); // 調(diào)用 get_contents() 不會(huì)在函數(shù)作用域之外填充變量 ?>
以上示例的輸出類似于:
array(9) { [0]=> string(15) "HTTP/1.1 200 OK" [1]=> string(35) "Date: Sat, 12 Apr 2008 17:30:38 GMT" [2]=> string(29) "Server: Apache/2.2.3 (CentOS)" [3]=> string(44) "Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT" [4]=> string(27) "ETag: "280100-1b6-80bfd280"" [5]=> string(20) "Accept-Ranges: bytes" [6]=> string(19) "Content-Length: 438" [7]=> string(17) "Connection: close" [8]=> string(38) "Content-Type: text/html; charset=UTF-8" } Warning: Undefined variable $http_response_header NULL
十二、$argc
$argc — 傳遞給腳本的參數(shù)數(shù)目。包含當(dāng)運(yùn)行于命令行下時(shí)傳遞給當(dāng)前腳本的參數(shù)的數(shù)目。
注意:
- 腳本的文件名總是作為參數(shù)傳遞給當(dāng)前腳本,因此 $argc 的最小值為 1;
- 這個(gè)變量僅在 register_argc_argv 打開時(shí)可用;
- 也可以在 $_SERVER[‘argc’] 中獲取。
$argc 范例:
<?php var_dump($argc); ?>
當(dāng)使用這個(gè)命令執(zhí)行: php script.php arg1 arg2 arg3
以上示例的輸出類似于:
int(4)
十三、$argv
$argv — 傳遞給腳本的參數(shù)數(shù)組。包含當(dāng)運(yùn)行于命令行下時(shí)傳遞給當(dāng)前腳本的參數(shù)的數(shù)組。
注意:
- 第一個(gè)參數(shù)總是當(dāng)前腳本的文件名,因此 $argv[0] 就是腳本文件名;
- 這個(gè)變量僅在 register_argc_argv 打開時(shí)可用;
- 也可以在 $_SERVER[‘argv’] 中獲取。
$argv 范例:
<?php var_dump($argv); ?>
當(dāng)使用這個(gè)命令執(zhí)行:php script.php arg1 arg2 arg3
以上示例的輸出類似于:
array(4) { [0]=> string(10) "script.php" [1]=> string(4) "arg1" [2]=> string(4) "arg2" [3]=> string(4) "arg3" }
十四、$php_?errormsg
注意:本特性已自 PHP 7.2.0 起廢棄,強(qiáng)烈建議不要使用本特性;
如果用戶定義了錯(cuò)誤處理句柄(set_error_handler())并且返回 false 的時(shí)候,$php_errormsg 就會(huì)被設(shè)置。
$php_errormsg — 前一個(gè)錯(cuò)誤信息。用 error_get_last() 函數(shù)代替。$php_errormsg 變量包含由 PHP 生成的最新錯(cuò)誤信息。這個(gè)變量只在錯(cuò)誤發(fā)生的作用域內(nèi)可用,并且要求 track_errors 配置項(xiàng)是開啟的(默認(rèn)是關(guān)閉的)。
$php_errormsg 范例:
<?php @strpos(); echo $php_errormsg; ?>
以上示例的輸出類似于:
Wrong parameter count for strpos()