• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

PHP Superglobals解释——带备忘单

在这篇文章中,我将为您提供一份关于 php 中可用的所有 PHP 超全局变量的备忘单快速参考。

什么是超全局变量?

我们来看看超全局变量的定义。

超全局变量是在所有范围内始终可用的内置变量。

无论您是经验丰富的 PHP 开发人员还是 PHP 开发的新手,您都会以一种或另一种方式使用这些超全局变量。PHP 中有几个预定义的变量被认为是超全局变量,这意味着您不需要使用global关键字来访问它们。超全局变量在脚本的所有范围内都可用。

让我们快速浏览一下 PHP 中的超全局变量:

  • $GLOBALS

  • $_SERVER

  • $_GET

  • $_post

  • $_FILES

  • $_cookie

  • $_SESSION

  • $_REQUEST

  • $_ENV

本文的目的是浏览 PHP 中的所有超全局变量并简要解释每个变量。

PHP 超全局快速参考

$GLOBALS

超$GLOBALS全局变量用于访问 PHP 中的所有全局变量。基本上,它是一个关联数组,其中包含在全局范围内定义的所有变量。

让我们看一下以下示例以了解其工作原理。

<?php
// variable defined in the global scope
$website_name = 'www.weixiaolive.com';

function displayWebsiteName() {
     // PHP Notice:  Undefined variable: website_name
     echo 'Website: ' . $website_name;

     // outputs “Website: www.weixiaolive.com”
     echo $GLOBALS['website_name'];
}

displayWebsiteName();

首先,我们$website_name在全局范围内定义了变量。

现在,当我们尝试访问函数$website_name中的变量时displayWebsiteName,它会尝试$website_name在本地范围内查找变量。由于没有在displayWebsiteName函数中定义它,你会收到一个 PHP 通知,抱怨你试图访问一个未定义的变量。

接下来,当我们尝试使用$GLOBALS超全局访问它时,它会起作用,因为该$GLOBALS变量包含对所有全局变量的引用。

$_SERVER

超$_SERVER全局变量保存 Web 服务器和执行环境信息。具体来说,它由具有 HTTP 标头、路径和脚本位置的 Web 服务器初始化。

让我们看一下print_r($_SERVER)命令的输出。

Array
(
    [USER] => ubuntu
    [HOME] => /var/www
    [HTTP_UPGRADE_INSECURE_REQUESTS] => 1
    [HTTP_COOKIE] => _ga=GA1.1.19480044.1597729890; 
    _hjid=41b3ce18-a24c-41d4-ac7f-dc5d9066120d; _ga_17Y2VJYG6X=GS1.1.1606729885.14.1.1606730391.0; 
    __gads=ID=4fad16ec33ad9598:T=1606730074:S=ALNI_MaYqS1Ftx7eMR2naLutOqRPT1LytQ
    [HTTP_CONNECTION] => keep-alive
    [HTTP_ACCEPT_ENCODING] => gzip, deflate
    [HTTP_ACCEPT_LANGUAGE] => en-US,en;q=0.5
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    [HTTP_USER_AGENT] => Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
    [HTTP_HOST] => localhost
    [REDIRECT_STATUS] => 200
    [SERVER_NAME] => localhost
    [SERVER_PORT] => 80
    [SERVER_ADDR] => 127.0.0.1
    [REMOTE_PORT] => 39482
    [REMOTE_ADDR] => 127.0.0.1
    [SERVER_SOFTWARE] => nginx/1.14.0
    [GATEWAY_INTERFACE] => CGI/1.1
    [REQUEST_SCHEME] => http
    [SERVER_PROTOCOL] => HTTP/1.1
    [DOCUMENT_ROOT] => /web/demoproject
    [DOCUMENT_URI] => /server.php
    [REQUEST_URI] => /server.php
    [SCRIPT_NAME] => /server.php
    [CONTENT_LENGTH] =>
    [CONTENT_TYPE] =>
    [REQUEST_METHOD] => GET
    [QUERY_STRING] =>
    [SCRIPT_FILENAME] => /web/demoproject/server.php
    [FCGI_ROLE] => RESPONDER
    [PHP_SELF] => /server.php
    [REQUEST_TIME_FLOAT] => 1613665334.6422
    [REQUEST_TIME] => 1613665334
)

大多数情况下,它包含特定于服务器的信息,例如服务器名称、服务器端口、脚本名称、文档根目录等。除此之外,它还可能包含有关客户端环境的信息,例如用户代理、远程 IP 地址、cookie 等。

重要的是,不能保证每个 Web 服务器都会初始化所有这些信息。此外,如果您从命令行运行脚本,则不会SERVER_*初始化任何变量,因为它们是特定于服务器的。

$_GET

当用户使用 GET 方法提交表单时,发送到服务器的表单数据$_GET在变量中可用。超$_GET全局变量包含一个变量数组,这些变量通过查询字符串传递给脚本。基本上,作为 URL 查询字符串的一部分传递的任何内容都将在$_GET超全局变量中可用。

让我们看一下下面的代码片段。

<form action = "/search.php" method = "GET">
    Search Keyword: <input type = "text" name = "keyword" />
    <input type = "submit" value=”Search”/>
</form>

在上面的示例中,当用户提交搜索表单时,关键字字段的值将通过查询字符串发送到服务器。

/search.php?keyword=PHP

在服务器端,您可以像这样访问它:

<?php
If (isset($_GET['keyword'])) {
    $search_keyword = filter_var($_GET['keyword'], FILTER_SANITIZE_STRING);
}
?>

您必须在用户输入被处理或显示回浏览器之前对其进行清理,这就是我们使用该filter_var函数清理$_GET[‘keyword’]变量值的原因。

$_POST

超$_GET全局变量用于收集通过 GET 方法提交的表单数据,$_POST超全局变量用于获取 POST 方法的表单数据。POST 表单数据不会显示在 URL 中;相反,它可以作为请求正文的一部分使用。

让我们看一下下面的代码片段。

<form action="/login.php" method="POST">
    Username: <input type="text" name="username" />
    Password: <input type="password" name="password" />
    <input type="submit" value="Login"/>
</form>

在上面的示例中,当用户提交搜索表单时,您可以在服务器端访问这样的字段值。

<?php
If (isset($_POST['username']) && isset($_POST['password'])) {
    $username = $_POST['username'];
    $password = $_POST['password'];
}
?>

当您使用$_POST数据时,您必须确保您采取了足够的措施来清理传入的数据,否则可能会导致对您的站点的潜在攻击。

$_FILES

当用户提交支持文件上传的表单时,$_FILES超全局变量将填充上传文件的信息。它是一个二维数组,包含上传文件的以下属性:

  • 名称:文件的名称

  • type : 文件的类型

  • 大小:文件的大小

  • tmp_name : 上传文件的服务器路径

  • error : 文件上传失败时出错

让我们看看下面的例子,看看文件上传在 PHP 中是如何工作的。

<!DOCTYPE html>
<html>
<body>
<div>
<form action="upload.php" method="POST" enctype="multipart/form-data">
    Upload File:<input type="file" name="document">
    <input type="submit" value="Upload" name="Submit">
</form>
</div>
</body>
</html>

在上面的示例中,我们将enctype属性设置为multipart/form-data,因此它启用了文件上传。当用户提交文件时,您可以使用$_FILES超全局变量来访问上传的文件信息,如以下代码段所示。

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if (isset($_FILES["document"]) && $_FILES["document"]["error"] === UPLOAD_ERR_OK) {
        $fileName     = $_FILES["document"]["name"];
        $fileType     = $_FILES["document"]["type"];
        $fileSize     = $_FILES["document"]["size"];
        $fileTmpName = $_FILES["document"]["tmp_name"];
          
        $fileNameCmps = explode(".", $fileName);
        $fileExtension = strtolower(end($fileNameCmps));

        // sanitize file-name
        $newFileName = md5(time() . $fileName) . '.' . $fileExtension;

        // check if file has one of the following extensions
        $allowedfileExtensions = array('jpg', 'gif', 'png', 'zip', 'txt', 'xls', 'doc');

        if (in_array($fileExtension, $allowedfileExtensions))
        {
          $uploadFileDir = './uploaded_files/';
          $dest_path = $uploadFileDir . $newFileName;

          if(move_uploaded_file($fileTmpPath, $dest_path))
          {
            $message ='File is successfully uploaded.';
          }
          else
          {
            $message = 'There was some error moving the file to upload directory. Please make sure the upload directory is writable by web server.';
          }
        }
        else
        {
          $message = 'Upload failed. Allowed file types: ' . implode(',', $allowedfileExtensions);
        }
        echo $message;
    } else {
        echo 'There was some error uploading the file:' . $_FILES["document"]["error"];
    }
}
?>

重要的是该$_FILES["document"]["tmp_name"]变量包含上传文件的路径,您可以使用该路径将上传的文件移动到所需位置。如果有错误,$_FILES["document"]["error"]变量将被填充。

$_COOKIE

顾名思义,$_COOKIE超全局变量用于读取当前脚本可用的 cookie。基本上,它允许您访问已经由setcookiePHP 中的函数设置的 cookie。该$_COOKIE变量是一个关联数组,其中包含通过 HTTP cookie 发送的所有 cookie 变量。

假设您已经lastVisitedSection使用以下代码段创建了 cookie。

<?php
setcookie('lastVisitedSection', 'codeTutsPlus', time() + 3600, "/");
?>

现在,您可以访问lastVisitedSectioncookie,如以下代码段所示。

<?php
if(isset($_COOKIE['lastVisitedSection'])) {
    echo 'Last visited section:' . htmlspecialchars($_COOKIE['lastVisitedSection']);
} else {
    echo 'We encourage you to explore different sections of www.weixiaolive.com!';
}
?>

这就是您可以在脚本中访问 cookie 的方式。

$_SESSION

如果您已经在 PHP 中使用过会话,那么您就会知道$_SESSION超全局变量。会话变量允许您在单个站点或应用程序的不同页面之间共享信息,因此它有助于维护状态。该$_SESSION变量包含可用于当前脚本的会话变量的关联数组。

让我们看一下以下示例,该示例演示了如何设置和获取会话变量。

<?php
session_start();

// set a session variable
$_SESSION['loggedInUserName'] = 'John';

// get a session variable later in the script or in subsequent requests
If (isset($_SESSION['loggedInUserName'])) {
    echo 'Hello, '. $_SESSION['loggedInUserName'];
} else {
    echo 'Login Now!';
}
?>

重要的是session_start必须在脚本开始$_SESSION时调用该函数以启动会话并初始化变量。

$_REQUEST

超$_REQUEST全局变量是一个包含 HTTP 请求变量的关联数组。基本上,它是$_GET、$_POST和$_COOKIE超全局变量的组合。因此,使用该$_REQUEST变量很方便,特别是如果您不想使用上述超全局变量。

此数组中变量的存在和顺序取决于php.ini文件中的request_order和variables_order配置指令的值。使用该变量时应始终小心,事实上,建议您使用, , 而不是使用此超全局变量。$_REQUEST$_GET$_POST$_COOKIE

$_ENV

超$_ENV全局变量是由环境方法传递给脚本的变量的关联数组。当您想为不同的环境(如本地、暂存和生产)设置不同的值时,它很有用。在您的应用程序中,您将拥有每个环境不同的数据库凭据和配置变量,因此,您可以使用该$_ENV变量在脚本中访问它们,因为它们是动态初始化的。您可以使用不同的方法来设置环境变量。

在 PHP 中,您可以使用该putenv函数对其进行初始化,如以下代码段所示。

putenv('HOSTNAME=localhost');

另一方面,如果要在 Apache 虚拟主机文件中设置环境变量,请使用:

SetEnv HOSTNAME localhost

您应该始终更喜欢该getenv函数来获取环境变量的值。

$hostname = getenv('HOSTNAME');

您应该始终使用该getenv函数来检索环境变量的值,因为$_ENV如果您没有通过php.ini文件variables_order中的配置指令启用它,该变量可能为空。配置指令定义了初始化 EGPCS(环境、获取、发布、Cookie 和服务器)变量的顺序。variables_order

结论

在本文中,我们介绍了 PHP 中可用的所有 PHP 超全局变量。对于每个变量,我都提供了一个简短但有意义的示例,应该可以帮助您理解其目的。我希望您可以将本文用作您日常 PHP 开发中的快速参考或备忘单。


文章目录
  • 什么是超全局变量?
  • PHP 超全局快速参考
    • $GLOBALS
    • $_SERVER
    • $_GET
    • $_POST
    • $_FILES
    • $_COOKIE
    • $_SESSION
    • $_REQUEST
    • $_ENV
  • 结论