[英]Understanding the PHP $GLOBALS variable
我正在從w3schools的PHP教程中學習PHP 。
在學習PHP時,我遇到了預定義全局變量(即Superglobals)的概念。
為了更好地理解“ Superglobals”,我編寫了以下代碼,並在本地計算機(即localhost)的瀏覽器中執行了以下代碼:
<!DOCTYPE html>
<html>
<body>
<?php
echo "<pre>";
print_r($GLOBALS);
echo "</pre>";
?>
</body>
</html>
我在瀏覽器中得到以下輸出:
Array
(
[_GET] => Array
(
)
[_POST] => Array
(
)
[_COOKIE] => Array
(
[toWorkNormally] => 1
)
[_FILES] => Array
(
)
[GLOBALS] => Array
*RECURSION*
)
上面的輸出在我心中產生了許多疑問,如下所示:
$GLOBALS, $_SERVER, $_REQUEST, $_POST, $_GET, $_FILES, $_ENV, $_COOKIE
$_SESSION
$GLOBALS, $_SERVER, $_REQUEST, $_POST, $_GET, $_FILES, $_ENV, $_COOKIE
, $_SESSION
, $_SESSION
$GLOBALS, $_SERVER, $_REQUEST, $_POST, $_GET, $_FILES, $_ENV, $_COOKIE
, $_SESSION
$GLOBALS, $_SERVER, $_REQUEST, $_POST, $_GET, $_FILES, $_ENV, $_COOKIE
, $_SESSION
$GLOBALS, $_SERVER, $_REQUEST, $_POST, $_GET, $_FILES, $_ENV, $_COOKIE
, $_SESSION
$GLOBALS, $_SERVER, $_REQUEST, $_POST, $_GET, $_FILES, $_ENV, $_COOKIE
和$_SESSION
那么我懷疑是預定義全局數組$GLOBALS
的數組元素是什么。 [_GET], [_POST], [_COOKIE], [_FILES]
是指它們作為超全局變量具有自己獨立的存在嗎? [toWorkNormally] => 1
是什么意思? [GLOBALS]
中是什么意思,以及如何打印這些元素? $GLOBALS
數組的目的是存儲用戶全局聲明的變量,那么該數組如何用其他一些值預填充,因為我沒有在代碼中聲明任何全局變量? 注意:我在計算機上使用“ Microsoft Windows 10 Home Single Language”操作系統。 這是一個64位操作系統。 我正在將最新版本的XAMPP與PHP 7.0.13和HTTP Apache Web服務器v.2.4.23一起在本地運行程序。 另外,請注意,我沒有在代碼中將任何其他變量定義為global或local。
根據我對PHP的了解,並進行了一些研究以及在使用不同版本的PHP的多個OS上進行測試,我發現了以下內容。
問題1和3:
是的,關於9個超全局變量,您是正確的,但要記住的一個非常重要的事情是$ GLOBALS- 引用全局范圍內所有可用的變量。
一個有趣的旁注,請注意,$ GLOBALS是唯一不以下划線開頭的超全局變量。
由於$ GLOBALS包含對所有其他超全局變量(包括自身)的引用,因此當我們print_r($ GLOBALS)時,它還將在輸出中包含其他超全局變量。 因為$ GLOBALS也引用自己,所以我們在第三點中得到了您所要求的RECURSION。 您可以將其視為包含$ GLOBALS的無限維數組。 幾乎與無限循環相同。
[GLOBALS] => Array
(
[GLOBALS] => Array
(
[GLOBALS] => Array
(
...
)
)
)
相反,腳本會看到此情況並停止執行,僅顯示RECURSION。 現在,我已經在3種不同的環境下對其進行了測試,並且每次更改超級全局變量的打印順序都進行了更改,但是一旦達到$ GLOBALS,它就會停止並打印RECURSION。
問題2:
我在$_COOKIE[toWorkNormally] => 1
上找不到任何信息。 我假設這是設置在其他地方。 我沒有在任何測試中看到它。
問題4:
這既不正確也不錯誤。 $ GLOBALS的目的不是全局存儲用戶創建的所有變量。 它僅引用全局范圍內所有可用的變量,包括超全局變量。 這就是為什么您在輸出中看到所有其他超全局變量的原因。 但是許多開發人員認為用戶定義的全局變量存儲在$ GLOBALS中。
包含對所有變量的引用的關聯數組,這些變量當前在腳本的全局范圍內定義。 變量名是數組的鍵。
要查看所有超全局變量,您將必須單獨print_r()
每個超全局變量。
要檢查所有用戶定義的全局變量,可以使用array_keys($GLOBALS)
所有不是超全局變量的項目很可能是用戶定義的全局變量。
編輯以回應用戶評論
回應您的第一條評論,不,他們沒有什么不同。 未打印的超級全局變量仍然是數組的一部分,但是執行/輸出停止,因為它到達$ GLOBALS時達到了RECURSION的要求。 超全局變量以隨機順序打印,並且在$ GLOBALS之后出現的情況都不會出現,因為它在$ GLOBALS檢測到RECURSION並停止輸出。
您可以使用print_r(array_keys($GLOBALS));
檢查所有超全局變量/全局變量print_r(array_keys($GLOBALS));
$ _SESSION除外,因為會話尚未啟動。 print_r($_SESSION)
將給您一個undefined variable $_SESSION
注意。 當您放置session_start();
時,您將看到$ _SESSION session_start();
在您打印之前。
PHP中的引用是通過不同名稱訪問相同變量內容的一種方式。
請注意,在PHP中,變量名稱和變量內容不同,因此相同的內容可以具有不同的名稱
$GLOBALS
是所有超級全局變量和用戶定義變量的全局變量。 因此,例如,如果您已聲明變量$a = 10;
在$GLOBALS
數組中,您有key => value對,其中key為a,值為10。如果要從$GLOBALS
獲取內容,則只需將其編寫為數組鍵即可。
例
$a = 25;
echo $GLOBALS['a'];
在上面的示例中,輸出將是$a
的值,所以25;
在您的示例toWorkNormally=>1
,這意味着您已將cookie設置為名稱toWorkNormally,並且值為1或true
另外,當您在$GLOBALS['_GET']
或$GLOBALS['_POST']
使用get或post方法提交表單時,您可以在超級全局$_GET
或$_POST
找到表單數據,
PHP手冊對$GLOBALS
變量說了以下內容:
包含對所有變量的引用的關聯數組,這些變量當前在腳本的全局范圍內定義。 變量名是數組的鍵。
這准確地描述了變量的作用。 它只是對現有變量的引用。
您正在談論的RECURSION
是引用其自身的$GLOBALS
變量。 由於我們不希望PHP無休止地輸出相同的輸出並在此過程中使服務器崩潰,因此有內置的故障保護功能,可以在這種情況下向您顯示RECURSION
警報。
我想補充一點, $GLOBALS
是一個超全局變量或預設的全局變量。 這意味着它在整個腳本的所有作用域中都可用。
1.據我對PHP的了解,有九種類型的超全局變量(預定義的PHP全局變量)。 $ GLOBALS,$ _ SERVER,$ _ REQUEST,$ _ POST,$ _ GET,$ _ FILES,$ _ ENV,$ _ COOKIE和$ _SESSION,那么我懷疑是預定義全局數組$ GLOBALS的數組元素是什么。 [_GET],[_ POST],[_ COOKIE],[_ FILES]是指它們作為超全局變量具有自己獨立的存在嗎?
從PHP的文檔 :
引用全局范圍內的所有可用變量
這意味着您可以直接訪問superglobal
也可以從$GLOBALS
訪問superglobal
,是的,您有兩種訪問方法。
2.數組輸出上方的[toWorkNormally] => 1是什么意思?
它在$ _COOKIE內部,因此有一個名為toWorkNormally
的cookie,其值為1
。 有關Cookie的更多信息
3.元素[GLOBALS]中的RECURSION是什么意思,以及如何打印這些元素? 遞歸表示它自己引用,如果打印出來,它將顯示$GLOBALS
的內容再次嵌套在GLOBALS
,這將導致無限循環。 為避免PHP只是打印*RECURSION*
。
4.由於$ GLOBALS數組的目的是存儲用戶全局聲明的變量,那么該數組如何用其他一些值預填充,因為我沒有在代碼中聲明任何全局變量?
從PHP的文檔 :
PHP中的幾個預定義變量是“ superglobals”,這意味着它們在腳本的所有作用域中都可用。 不需要做全局變量。 在函數或方法中訪問它們。
因此,換句話說, $GLOBALS
將向您顯示PHP中的那些預定義變量以及您手動設置的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.