簡體   English   中英

了解PHP $ GLOBALS變量

[英]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*
)

上面的輸出在我心中產生了許多疑問,如下所示:

  1. 據我對PHP的了解,有九種類型的超全局變量(預定義的PHP全局變量)。 $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]是指它們作為超全局變量具有自己獨立的存在嗎?
  2. 數組輸出上方的[toWorkNormally] => 1是什么意思?
  3. RECURSION在元素[GLOBALS]中是什么意思,以及如何打印這些元素?
  4. 由於$GLOBALS數組的目的是存儲用戶全局聲明的變量,那么該數組如何用其他一些值預填充,因為我沒有在代碼中聲明任何全局變量?

注意:我在計算機上使用“ Microsoft Windows 10 Home Single Language”操作系統。 這是一個64位操作系統。 我正在將最新版本的XAMPPPHP 7.0.13HTTP 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中。

PHP.net手冊中的描述

包含對所有變量的引用的關聯數組,這些變量當前在腳本的全局范圍內定義。 變量名是數組的鍵。

要查看所有超全局變量,您將必須單獨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中的引用是通過不同名稱訪問相同變量內容的一種方式。

請注意,在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM