----- 最近更新【2022-01-12】-----
本文目錄結(jié)構(gòu)預(yù)覽:
- 一扇调、簡(jiǎn)介
- 二、超全局變量
1荸百、$GLOBALS
2财忽、$_SERVER
3畔规、$_GET
4、$_POST
5、$_FILES
6悦屏、$_COOKIE
7黍析、$_SESSION
8卖怜、$_REQUEST
9、$_ENV - 三阐枣、經(jīng)典案例
- 四马靠、參考
一奄抽、簡(jiǎn)介
定義:超全局變量是在全部作用域中始終可用的內(nèi)置變量。PHP 中的許多預(yù)定義變量都是“超全局的”甩鳄,這意味著它們?cè)谝粋€(gè)腳本的全部作用域中都可用逞度。在函數(shù)或方法中無需執(zhí)行global $variable
,就可以訪問它們娩贷。
在PHP中超全局變量一共有9種第晰,它們分別是:$GLOBALS
、$_SERVER
彬祖、$_GET
茁瘦、$_POST
、$_FILES
储笑、$_COOKIE
甜熔、$_SESSION
、$_REQUEST
突倍、$_ENV
二腔稀、超全局變量
1、$GLOBALS
一個(gè)包含了全部變量的全局組合數(shù)組羽历。變量的名字就是數(shù)組的鍵焊虏。
使用var_dump($GLOBALS)
打印,就可以看出$GLOBALS
是一個(gè)包含了所有的一個(gè)全局組合數(shù)組秕磷。
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<
例:
function test() {
$foo = "local variable";
echo '$foo : ' . $GLOBALS["foo"] . "\n";
echo '$foo : ' . $foo . "\n";
}
$foo = "Example content";
test();
//運(yùn)行結(jié)果:
$foo 在全局作用域: Example content
$foo 在當(dāng)前作用域: local variable
警告: 從 PHP 8.1.0 起诵闭,不再支持對(duì)整個(gè)
$GLOBALS
數(shù)組的寫訪問
從 PHP 8.1.0 起,$GLOBALS
現(xiàn)在是全局符號(hào)表的只讀副本澎嚣。 也就是說疏尿,全局變量不能通過副本進(jìn)行修改。 在之前的版本中易桃,$GLOBALS
數(shù)組和 PHP 數(shù)組通常傳值的行為不一樣褥琐,全局變量可通過副本修改。
PHP 8.1.0 之前:
$a = 1;
$globals = $GLOBALS; // 表面意義的按值復(fù)制
$globals['a'] = 2; // $GLOBALS['a'] 的值也相應(yīng)修改
var_dump($a);
//運(yùn)行結(jié)果:
int(2)
從 PHP 8.1.0 起:
$a = 1;
$globals = $GLOBALS; //表面意義的按值復(fù)制
$globals['a'] = 2; // $GLOBALS['a'] 的值不會(huì)改變(不再修改 $a)
var_dump($a);
//運(yùn)行結(jié)果:
int(1)
要恢復(fù)以前的行為晤郑,請(qǐng)迭代其副本并將每個(gè)屬性分配回 $GLOBALS
:
foreach ($globals as $key => $value) {
$GLOBALS[$key] = $value;
}
2敌呈、$_SERVER
$_SERVER
——服務(wù)器和執(zhí)行環(huán)境信息。$_SERVER
是一個(gè)包含了諸如頭信息(header)造寝、路徑(path)磕洪、以及腳本位置(script locations)等等信息的數(shù)組。這個(gè)數(shù)組中的項(xiàng)目由 Web 服務(wù)器創(chuàng)建匹舞。
$_SERVER
包含的信息比較多褐鸥,這里就幾個(gè)常見的拿出來講解一下:
- 1)SERVER_ADDR
當(dāng)前運(yùn)行腳本所在的服務(wù)器的 IP 地址线脚。
如:'SERVER_ADDR' => string '172. ... .20' (length=13)
- 2)SERVER_NAME
當(dāng)前運(yùn)行腳本所在的服務(wù)器的主機(jī)名赐稽。如果腳本運(yùn)行于虛擬主機(jī)中叫榕,該名稱是由那個(gè)虛擬主機(jī)所設(shè)置的值決定。(獲取域名或服務(wù)器ip)
如:'SERVER_NAME' => string '47. ... .116' (length=14)
還可以使用函數(shù)gethostbyname()
獲取服務(wù)器ip姊舵。 - 3)SERVER_PORT
Web 服務(wù)器使用的端口晰绎。默認(rèn)值為 “80”。如果使用 SSL 安全連接括丁,則這個(gè)值為用戶設(shè)置的 HTTP 端口荞下。
如:'SERVER_PORT' => string '80' (length=2)
- 4)REQUEST_METHOD
訪問頁面使用的請(qǐng)求方法;例如史飞,“GET”, “HEAD”尖昏,“POST”,“PUT”构资。 - 5)REQUEST_URI
URI 用來指定要訪問的頁面抽诉。(獲取當(dāng)前域名的后綴,返回完整的路徑吐绵,包含參數(shù))
如:'REQUEST_URI' => string '/demo12.php?aa=12345' (length=20)
- 6)QUERY_STRING
query string(查詢字符串)迹淌,如果有的話,通過它進(jìn)行頁面訪問己单。
如:'QUERY_STRING' => string 'aa=12345' (length=8)
- 7)HTTP_ACCEPT
當(dāng)前請(qǐng)求頭中 Accept: 項(xiàng)的內(nèi)容唉窃,如果存在的話。
如:'HTTP_ACCEPT' => string 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' (length=74)
- 8)HTTP_HOST
當(dāng)前請(qǐng)求頭中 Host: 項(xiàng)的內(nèi)容纹笼,如果存在的話纹份。(獲取域名或服務(wù)器ip)
如:'HTTP_HOST' => string '47. ... .116' (length=14)
- 9)HTTP_REFERER
引導(dǎo)用戶代理到當(dāng)前頁的前一頁的地址(如果存在)。由 user agent 設(shè)置決定允乐。并不是所有的用戶代理都會(huì)設(shè)置該項(xiàng)矮嫉,有的還提供了修改 HTTP_REFERER 的功能。簡(jiǎn)言之牍疏,該值并不可信蠢笋。 - 10)REMOTE_ADDR
瀏覽當(dāng)前頁面的用戶的 IP 地址。(客戶端ip:有可能是用戶的IP鳞陨,也可能是代理的IP)
如:'REMOTE_ADDR' => string '112.97.57.177' (length=13)
- 11)SCRIPT_NAME
包含當(dāng)前腳本的路徑昨寞。這在頁面需要指向自己時(shí)非常有用。__FILE__
常量包含當(dāng)前腳本(例如包含文件)的完整路徑和文件名厦滤。
如:'SCRIPT_NAME' => string '/demo12.php' (length=11)
- 12)SCRIPT_FILENAME
當(dāng)前執(zhí)行腳本的絕對(duì)路徑援岩。
如:'SCRIPT_FILENAME' => string '/var/www/html/demo12.php' (length=24)
更多的參數(shù)請(qǐng)查看:http://php.net/manual/zh/reserved.variables.server.php
3、$_GET
通過 URL 參數(shù)傳遞給當(dāng)前腳本的變量的數(shù)組掏导。注意:該數(shù)組不僅僅對(duì) method 為 GET
的請(qǐng)求生效享怀,而是會(huì)針對(duì)所有帶 query string 的請(qǐng)求。
4趟咆、$_POST
預(yù)定義的 $_POST
變量用于收集來自 method="post"
的表單中的值添瓷。
當(dāng) HTTP POST 請(qǐng)求的 Content-Type 是 application/x-www-form-urlencoded
或 multipart/form-data
時(shí)梅屉,會(huì)將變量以關(guān)聯(lián)數(shù)組形式傳入當(dāng)前腳本。
從帶有 POST 方法的表單發(fā)送的信息鳞贷,對(duì)任何人都是不可見的(不會(huì)顯示在瀏覽器的地址欄)坯汤,并且對(duì)發(fā)送信息的量也沒有限制。
注釋:然而搀愧,默認(rèn)情況下惰聂,POST 方法的發(fā)送信息的量最大值為 8 MB(可通過設(shè)置 php.ini 文件中的 post_max_size 進(jìn)行更改)。
5咱筛、$_FILES
通過 HTTP POST 方式上傳到當(dāng)前腳本的項(xiàng)目的數(shù)組搓幌。
$_FILES
是一個(gè)二維數(shù)組,其內(nèi)容主要有以下五項(xiàng):
1)$_FILES["userfile"]["error"]
error總共有5個(gè)不同的返回值迅箩,其中0表示成功鼻种,另外4個(gè)表示在嘗試中出現(xiàn)錯(cuò)誤。
- 0(UPLOAD_ERR_OK):沒有錯(cuò)誤發(fā)生沙热,文件上傳成功叉钥。
- 1(UPLOAD_ERR_INI_SIZE):上傳的文件超過了 php.ini 中upload_max_filesize 選項(xiàng)限制的值。
- 2(UPLOAD_ERR_FORM_SIZE):上傳文件的大小超過了 HTML 表單中MAX_FILE_SIZE 選項(xiàng)指定的值篙贸。
- 3(UPLOAD_ERR_PARTIAL):文件只有部分被上傳投队。
- 4(UPLOAD_ERR_NO_FILE):沒有文件被上傳。
- 5:上傳文件大小為0爵川。
- 6(UPLOAD_ERR_NO_TMP_DIR):找不到臨時(shí)文件夾敷鸦。PHP 5.0.3 引進(jìn)。
- 7(UPLOAD_ERR_CANT_WRITE):文件寫入失敗寝贡。PHP 5.1.0 引進(jìn)扒披。
2)$_FILES["userfile"]["name"]
name表示客戶端機(jī)器上聲明的文件最初的名字,包括擴(kuò)展名圃泡。因此碟案,如果瀏覽器一個(gè)名為test.png的文件,并通過表單上傳颇蜡,則此變量的值將是test.png价说。
3)$_FILES["userfile"]["size"]
size指定從客戶端上傳的文件的大小,以字節(jié)為單位风秤。因此鳖目,在test.png文件的例子中,此函數(shù)可能賦值為5253缤弦,大約為5kb.
4)$_FILES["userfile"]["tmp_name"]
tmp_name指定上傳到服務(wù)器后為文件賦予的臨時(shí)名领迈。這是存儲(chǔ)在臨時(shí)目錄(由PHP指令upload_tmp_dir指定)中時(shí)所指定的文件名。
5)$_FILES["userfile"]["type"]
type指定從客戶端上傳的文件的mime類型。因此狸捅,在test.png文件的例子中兵迅,此變量會(huì)賦值為image/png。如果上傳的是PDF薪贫,則賦值為application/pdf。因?yàn)檫@個(gè)變量有時(shí)會(huì)得到意外的結(jié)果刻恭,所以應(yīng)當(dāng)在腳本中顯示地進(jìn)行驗(yàn)證瞧省。
6、$_COOKIE
通過 HTTP Cookies 方式傳遞給當(dāng)前腳本的變量的數(shù)組鳍贾。
7鞍匾、$_SESSION
當(dāng)前腳本可用 SESSION 變量的數(shù)組。
8骑科、$_REQUEST
默認(rèn)情況下包含了 $_GET
橡淑,$_POST
和 $_COOKIE
的數(shù)組。由于安全的問題咆爽,建議盡量避免使用$_REQUEST
梁棠。
9、$_ENV
通過環(huán)境方式傳遞給當(dāng)前腳本的變量的數(shù)組斗埂。
這些變量被從 PHP 解析器的運(yùn)行環(huán)境導(dǎo)入到 PHP 的全局命名空間符糊。很多是由支持 PHP 運(yùn)行的 Shell 提供的,并且不同的系統(tǒng)很可能運(yùn)行著不同種類的 Shell呛凶,所以不可能有一份確定的列表男娄。請(qǐng)查看你的 Shell 文檔來獲取定義的環(huán)境變量列表。
其他環(huán)境變量包含了 CGI 變量漾稀,而不管 PHP 是以服務(wù)器模塊還是 CGI 處理器的方式運(yùn)行模闲。
三、經(jīng)典案例
1崭捍、用php寫出顯示客戶端ip與服務(wù)器ip的代碼
$_SERVER["REMOTE_ADDR"]
$_SERVER["SERVER_ADDR"]
2尸折、獲取當(dāng)前頁面的完整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']."http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
四殷蛇、參考
官方手冊(cè):http://www.php.net/manual/zh/language.variables.superglobals.php