PHP強(qiáng)化之04 - 超全局?jǐn)?shù)組(新)

----- 最近更新【2022-01-12】-----

PHP強(qiáng)化系列--目錄

本文目錄結(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-urlencodedmultipart/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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末翁授,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子晾咪,更是在濱河造成了極大的恐慌收擦,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谍倦,死亡現(xiàn)場(chǎng)離奇詭異塞赂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)昼蛀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門宴猾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來圆存,“玉大人,你說我怎么就攤上這事仇哆÷僬蓿” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵讹剔,是天一觀的道長(zhǎng)油讯。 經(jīng)常有香客問我,道長(zhǎng)延欠,這世上最難降的妖魔是什么陌兑? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮由捎,結(jié)果婚禮上兔综,老公的妹妹穿的比我還像新娘。我一直安慰自己狞玛,他們只是感情好软驰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著心肪,像睡著了一般碌宴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蒙畴,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天贰镣,我揣著相機(jī)與錄音,去河邊找鬼膳凝。 笑死碑隆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蹬音。 我是一名探鬼主播上煤,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼著淆!你這毒婦竟也來了劫狠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤永部,失蹤者是張志新(化名)和其女友劉穎独泞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苔埋,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡懦砂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荞膘。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罚随,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出羽资,到底是詐尸還是另有隱情淘菩,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布屠升,位于F島的核電站潮改,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏弥激。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一愿阐、第九天 我趴在偏房一處隱蔽的房頂上張望微服。 院中可真熱鬧,春花似錦缨历、人聲如沸以蕴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丛肮。三九已至,卻和暖如春魄缚,著一層夾襖步出監(jiān)牢的瞬間宝与,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國打工冶匹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留习劫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓嚼隘,卻偏偏與公主長(zhǎng)得像诽里,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子飞蛹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容