PHP: 超全局变量

你现在站在服务器和浏览器之间的分界线上。超全局变量是 PHP 给的"快递包裹"——每次请求,浏览器把用户数据打包送过来,PHP 帮你拆开放在这些变量里,随时随地可用。

1. 什么是超全局变量?

超全局变量(Superglobals) 是 PHP 内置的、在任何作用域都能直接访问的变量。它们以 $_ 开头,不用 global 关键字就能在函数内使用。

超全局变量 内容 示例场景
$_SERVER 服务器和执行环境信息 获取当前URL、判断HTTPS
$_GET URL 查询参数 分页 ?page=2、搜索 ?q=PHP
$_POST 表单 POST 数据 登录名/密码提交
$_FILES 上传的文件 头像上传
$_COOKIE 浏览器端的 Cookie "记住我"功能
$_SESSION 服务器端的会话 登录状态保持

2. $_SERVER

$_SERVER 是一个包含了服务器和执行环境信息的数组:

PHP
<?php
// 基础信息
echo $_SERVER['REQUEST_METHOD'];    // GET 或 POST
echo $_SERVER['REQUEST_URI'];       // /myphp/page.php?id=1
echo $_SERVER['HTTP_HOST'];         // localhost
echo $_SERVER['SERVER_NAME'];       // localhost
echo $_SERVER['SERVER_PORT'];       // 80
echo $_SERVER['REMOTE_ADDR'];       // 127.0.0.1(用户IP)
echo $_SERVER['HTTP_USER_AGENT'];   // 用户浏览器信息
echo $_SERVER['SCRIPT_NAME'];       // /myphp/page.php
echo $_SERVER['PHP_SELF'];          // /myphp/page.php

// 判断是否 HTTPS
$isHttps = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on';

// 获取当前完整URL
$currentUrl = ($isHttps ? "https" : "http") . "://"
    . $_SERVER['HTTP_HOST']
    . $_SERVER['REQUEST_URI'];
echo $currentUrl;  // http://localhost/myphp/demo.php
?>
💡 提示: $_SERVER['REMOTE_ADDR'] 获取用户真实 IP(但如果有代理就可能是代理 IP)。$_SERVER['HTTP_USER_AGENT'] 可以做浏览器类型判断,但不是 100% 可靠(用户可伪造)。


3. $_GET — URL 查询参数

在 URL 后面加 ?key=value,PHP 自动解析到 $_GET 中:

TEXT 📖 仅展示
http://localhost/search.php?q=PHP&page=2&sort=newest
                              ↑          ↑       ↑
                         $_GET['q'] $_GET['page'] $_GET['sort']
PHP
<?php
// search.php
$keyword = $_GET['q'] ?? "未指定搜索词";
$page    = $_GET['page'] ?? 1;
$sort    = $_GET['sort'] ?? "relevance";

echo "搜索词:{$keyword}<br>";
echo "第 {$page} 页<br>";
echo "排序方式:{$sort}<br>";
?>

▶ 示例:淘宝风格的分页

PHP
<?php
$page = (int)($_GET['page'] ?? 1);
$perPage = 20;

echo "<h3>商品列表 — 第 {$page} 页</h3>";

// 生成分页链接
for ($i = 1; $i <= 5; $i++) {
    $active = ($i == $page) ? "style='font-weight:bold;color:red'" : "";
    echo "<a href='?page={$i}' {$active}>{$i}</a> ";
}
?>
▶ 试一试
💡 提示: $_GET 的值永远是字符串("2" 不是 2)。用 (int)intval() 转换成数字后再参与数学运算。


4. $_POST — 表单数据

$_POST 用于接收表单通过 method="POST" 提交的数据。这是 Web 开发最核心的交互方式:

▶ 示例:表单提交

PHP
<?php
// 检测是否 POST 请求
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name = trim($_POST['name'] ?? '');
    $message = trim($_POST['message'] ?? '');
    
    if ($name && $message) {
        echo "<h3>留言成功!</h3>";
        echo "<p><strong>{$name}:</strong>{$message}</p>";
    } else {
        echo "<p style='color:red'>请填写所有字段</p>";
    }
}
?>

<form method="POST" action="">
    <p>
        <label>名字:</label>
        <input type="text" name="name" value="<?= $_POST['name'] ?? '' ?>">
    </p>
    <p>
        <label>留言:</label>
        <textarea name="message"><?= $_POST['message'] ?? '' ?></textarea>
    </p>
    <button type="submit">提交留言</button>
</form>
▶ 试一试
💡 提示: action="" 表示提交到当前页面本身,这是常见模式——一个 PHP 文件同时负责显示表单和处理提交。


5. GET vs POST

GET POST
数据位置 URL 查询字符串(可见) HTTP 请求体(不可见)
数据大小 约 2048 字符 理论上无限制
书签/分享 ✅ 可以 ❌ 不能
浏览器缓存 会被缓存 不会被缓存
适用场景 搜索、分页、筛选 登录、注册、修改数据
安全性 参数暴露在 URL 相对安全(但不加密)
TEXT 📖 仅展示
GET  →  我要看第2页的商品          → 适合查询
POST →  我要提交我的账号密码        → 适合修改
💡 提示: 铁律——读操作用 GET,写操作用 POST。 绝对不要用 GET 传送密码、信用卡等敏感信息(它们会留在浏览器历史里)。

▶ 示例:$_REQUEST(不推荐)

PHP
<?php
// $_REQUEST 合并了 $_GET + $_POST + $_COOKIE
// 不推荐!不安全,搞不清数据来自哪
$unreliable = $_REQUEST['name'] ?? '';
// 永远用明确的 $_GET 或 $_POST
?>
▶ 试一试

❓ 常见问题

Q $_GET 能传数组吗?
A 能。?tags[]=PHP&tags[]=MySQL 会生成 $_GET['tags'] = ['PHP', 'MySQL']?user[name]=小明&user[age]=25 生成嵌套数组。
Q POST 请求的数据在哪里?为什么请求这么长?
A POST 参数在 HTTP 请求体中(不像 GET 那样在 URL 里)。在浏览器开发者工具的 Network 标签中可以查看。
Q 为什么有的网站既有 ?key=val 参数,又是 POST?
A 常见情况是 POST 表单的 action="page.php?id=1"id=1 走 GET,表单字段走 POST。一个请求可以同时有 GET 和 POST 数据。

📖 小节

📝 作业

  1. 写一个页面 greet.php,接收 URL 参数 ?name=你的名字,在页面上输出"你好,XXX!"。如果没传 name 参数,显示"你好,游客!"。
  2. 写一个分页演示页面,接收 ?page=N 参数,在页面上显示"当前第 N 页"并生成到第 10 页的分页链接。
  3. 写一个留言板表单(用 POST),提交后在页面下方显示所有历史留言(用文件存储,提示:file_put_contents + file_get_contents)。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏