PHP 超级全局变量
最后修改日期:2025年4月5日
PHP 超级全局变量是内置变量,在所有范围内始终可用。它们提供对各种类型数据的访问,例如表单输入、服务器信息和会话数据。超级全局变量对于 PHP 中的 Web 开发至关重要。
基本定义
超级全局变量是 PHP 中预定义的变量,可以从任何范围访问。它们以 $_ 开头,后跟其大写名称。这些变量由 PHP 自动填充相关数据。
主要的超级全局变量有 $_GET、$_POST、$_REQUEST、$_SERVER、$_SESSION、$_COOKIE、$_FILES、$_ENV 和 $GLOBALS。每个变量在 Web 应用程序中都有特定的用途。
$_GET - 处理 URL 参数
$_GET
超级全局变量收集通过 URL 参数发送到脚本的数据。
<?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 方法发送的数据,通常来自表单。
<?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 包含有关服务器和当前请求的信息。
<?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 存储跨多个页面请求的持久用户数据。
<?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。
<?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 上传的文件的信息。
<?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 中配置)。
<?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
包含环境变量,用于配置。
<?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 引用全局范围内可用的所有变量。
<?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']
)。
最佳实践
- 验证: 始终验证和清理超级全局变量数据。
- 特异性: 为了清晰起见,首选 $_GET/$_POST 而不是 $_REQUEST。
- 安全性: 转义输出以防止 XSS 攻击。
- 会话: 登录后重新生成会话 ID。
- 文件: 限制上传允许的文件类型。
- Cookie: 对敏感 Cookie 使用 HttpOnly 和 Secure 标志。
- 环境: 将敏感数据存储在 $_ENV 中,而不是代码中。
来源
本教程介绍了 PHP 超级全局变量,并提供了实际示例,展示了它们在不同场景中的用法。超级全局变量对于 Web 开发至关重要。
作者
列出 所有 PHP 教程。