在这篇文章中,我将为您提供一份关于 php 中可用的所有 PHP 超全局变量的备忘单快速参考。
什么是超全局变量?
我们来看看超全局变量的定义。
超全局变量是在所有范围内始终可用的内置变量。
无论您是经验丰富的 PHP 开发人员还是 PHP 开发的新手,您都会以一种或另一种方式使用这些超全局变量。PHP 中有几个预定义的变量被认为是超全局变量,这意味着您不需要使用global关键字来访问它们。超全局变量在脚本的所有范围内都可用。
让我们快速浏览一下 PHP 中的超全局变量:
本文的目的是浏览 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 开发中的快速参考或备忘单。
- $GLOBALS
- $_SERVER
- $_GET
- $_POST
- $_FILES
- $_COOKIE
- $_SESSION
- $_REQUEST
- $_ENV