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 数据。📖 小节
$_SERVER获取服务器信息(URL、IP、请求方法等)$_GET获取 URL 查询参数(?key=val格式,用于搜索/分页)$_POST获取表单提交数据(method="POST",用于登录/注册)- GET 用于读操作(查询),POST 用于写操作(修改数据)
- 绝对不要用 GET 传递密码等敏感信息
- 用
$_GET['key'] ?? '默认值'安全获取参数 - $_REQUEST 不要用——数据来源混淆
📝 作业
- 写一个页面
greet.php,接收 URL 参数?name=你的名字,在页面上输出"你好,XXX!"。如果没传 name 参数,显示"你好,游客!"。 - 写一个分页演示页面,接收
?page=N参数,在页面上显示"当前第 N 页"并生成到第 10 页的分页链接。 - 写一个留言板表单(用 POST),提交后在页面下方显示所有历史留言(用文件存储,提示:
file_put_contents+file_get_contents)。