ZetCode

PHP 超级全局变量

最后修改日期:2025年4月5日

PHP 超级全局变量是内置变量,在所有范围内始终可用。它们提供对各种类型数据的访问,例如表单输入、服务器信息和会话数据。超级全局变量对于 PHP 中的 Web 开发至关重要。

基本定义

超级全局变量是 PHP 中预定义的变量,可以从任何范围访问。它们以 $_ 开头,后跟其大写名称。这些变量由 PHP 自动填充相关数据。

主要的超级全局变量有 $_GET、$_POST、$_REQUEST、$_SERVER、$_SESSION、$_COOKIE、$_FILES、$_ENV 和 $GLOBALS。每个变量在 Web 应用程序中都有特定的用途。

$_GET - 处理 URL 参数

$_GET 超级全局变量收集通过 URL 参数发送到脚本的数据。

get_example.php
<?php

// URL: get_example.php?name=John&age=25

if (isset($_GET['name'])) {
    echo "Hello, " . htmlspecialchars($_GET['name']) . "!<br>";
}

if (isset($_GET['age'])) {
    echo "You are " . (int)$_GET['age'] . " years old.";
}

此示例显示如何使用 $_GET 访问 URL 参数。htmlspecialchars 函数通过转义 HTML 字符来防止 XSS 攻击。(int) 强制转换确保 age 被视为一个数字。

$_GET 通常用于搜索过滤器、分页以及其他可以通过 URL 收藏或共享的非敏感数据。

$_POST - 处理表单提交

$_POST 超级全局变量收集通过 HTTP POST 方法发送的数据,通常来自表单。

post_example.php
<?php

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $username = $_POST['username'] ?? '';
    $password = $_POST['password'] ?? '';
    
    echo "Username: " . htmlspecialchars($username) . "<br>";
    echo "Password: " . htmlspecialchars($password);
}
?>

<form method="post">
    Username: <input type="text" name="username"><br>
    Password: <input type="password" name="password"><br>
    <input type="submit" value="Submit">
</form>

这演示了如何使用 $_POST 处理表单数据。如果字段为空,则空合并运算符 (??) 提供默认值。在处理之前,始终验证和清理用户输入。

$_POST 适用于敏感数据和表单提交,因为数据在 URL 中不可见。

$_SERVER - 服务器和执行环境信息

$_SERVER 包含有关服务器和当前请求的信息。

server_example.php
<?php

echo "Server Name: " . $_SERVER['SERVER_NAME'] . "<br>";
echo "Server Software: " . $_SERVER['SERVER_SOFTWARE'] . "<br>";
echo "User IP Address: " . $_SERVER['REMOTE_ADDR'] . "<br>";
echo "Request Method: " . $_SERVER['REQUEST_METHOD'] . "<br>";
echo "Script Name: " . $_SERVER['SCRIPT_NAME'] . "<br>";

这显示了各种服务器和请求信息。$_SERVER 对于日志记录、调试和基于请求环境的条件逻辑很有用。

常见用法包括检测 HTTPS、获取请求 URI 或识别用户的 IP 地址。请注意,某些值可能被客户端欺骗。

$_SESSION - 管理用户会话

$_SESSION 存储跨多个页面请求的持久用户数据。

session_example.php
<?php
session_start();

// Set session data
$_SESSION['username'] = 'john_doe';
$_SESSION['last_visit'] = date('Y-m-d H:i:s');

// Access session data
echo "Welcome back, " . $_SESSION['username'] . "<br>";
echo "Your last visit was: " . $_SESSION['last_visit'];

// Unset specific session variable
unset($_SESSION['last_visit']);

// Destroy entire session
// session_destroy();

这显示了基本的会话管理。在访问 $_SESSION 之前,必须调用 session_start。会话数据会一直存在,直到浏览器关闭或会话被销毁。

会话通常用于用户身份验证、购物车和在页面浏览之间保持状态。

$_COOKIE - 使用 HTTP Cookie

$_COOKIE 包含客户端发送的 HTTP Cookie。

cookie_example.php
<?php

// Set a cookie that expires in 1 hour
setcookie('user_preference', 'dark_mode', time() + 3600, '/');

// Access cookie
if (isset($_COOKIE['user_preference'])) {
    echo "Your preference: " . $_COOKIE['user_preference'];
} else {
    echo "No preference set.";
}

// Delete cookie
// setcookie('user_preference', '', time() - 3600, '/');

这演示了设置和访问 Cookie。Cookie 存储在客户端,并随每个请求一起发送。它们对于记住用户偏好很有用。

Cookie 具有过期日期,可以通过设置过期的时戳来删除。始终清理 Cookie 数据,因为它们可以被用户修改。

$_FILES - 处理文件上传

$_FILES 包含有关通过 HTTP POST 上传的文件的信息。

file_upload.php
<?php

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $uploadDir = 'uploads/';
    $uploadFile = $uploadDir . basename($_FILES['file']['name']);
    
    if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadFile)) {
        echo "File uploaded successfully.<br>";
        echo "Name: " . $_FILES['file']['name'] . "<br>";
        echo "Size: " . ($_FILES['file']['size'] / 1024) . " KB<br>";
        echo "Type: " . $_FILES['file']['type'] . "<br>";
    } else {
        echo "File upload failed.";
    }
}
?>

<form method="post" enctype="multipart/form-data">
    Select file: <input type="file" name="file"><br>
    <input type="submit" value="Upload">
</form>

这处理文件上传。表单必须具有 enctype="multipart/form-data"。move_uploaded_file 将文件从临时存储移动到永久位置。

始终验证文件类型和大小以确保安全。$_FILES 包含每个上传文件的名称、类型、大小、tmp_name(临时路径)和错误代码。

$_REQUEST - 组合 GET、POST 和 COOKIE 数据

$_REQUEST 合并来自 $_GET$_POST$_COOKIE 的数据(可在 php.ini 中配置)。

request_example.php
<?php

// URL: request_example.php?color=blue
// Or form submission with color field

$color = $_REQUEST['color'] ?? 'white';
echo "Selected color: " . htmlspecialchars($color);

// Better to use specific superglobals for clarity:
// $color = $_GET['color'] ?? $_POST['color'] ?? 'white';

$_REQUEST 提供了一种访问输入数据的方式,而无需知道方法。但是,为了清晰和安全起见,通常最好直接使用 $_GET$_POST

$_REQUEST 中变量的顺序由 php.ini 中的 request_order 设置确定(默认值:GP - GET 然后 POST)。

$_ENV - 环境变量

$_ENV 包含环境变量,用于配置。

env_example.php
<?php

// Set in .htaccess or server config:
// SetEnv DB_HOST localhost

echo "Database Host: " . ($_ENV['DB_HOST'] ?? 'not set') . "<br>";
echo "PHP Version: " . ($_ENV['PHP_VERSION'] ?? 'unknown');

// Alternative: getenv()
// echo "Database Host: " . getenv('DB_HOST');

$_ENV 从 PHP 运行的环境中填充。它通常用于存储敏感配置,例如数据库凭据。

可以在服务器配置文件或 .env 文件中设置环境变量(使用 vlucas/phpdotenv 等库)。

$GLOBALS - 访问所有全局变量

$GLOBALS 引用全局范围内可用的所有变量。

globals_example.php
<?php

$siteName = "My Website";
$version = "1.0";

function displayInfo() {
    echo "Welcome to " . $GLOBALS['siteName'] . "<br>";
    echo "Version: " . $GLOBALS['version'];
}

displayInfo();

// Generally better to pass variables as parameters:
// function displayInfo($siteName, $version) { ... }

$GLOBALS 提供对来自任何范围的全局变量的访问。但是,通常不建议使用全局变量,而主张显式传递变量。

超级全局变量本身在 $GLOBALS 中也可用(例如,$GLOBALS['_GET'])。

最佳实践

来源

PHP 超级全局变量文档

本教程介绍了 PHP 超级全局变量,并提供了实际示例,展示了它们在不同场景中的用法。超级全局变量对于 Web 开发至关重要。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出 所有 PHP 教程