PHP 超级全局变量
Nine built-in arrays available in every scope.
九个超级全局变量
| Variable | Contents | Typical use |
|---|---|---|
| $GLOBALS | 所有全局变量 | 在函数里改全局变量 |
| $_SERVER | 服务器与请求信息 | 请求方法、URL、IP |
| $_GET | URL 查询串参数 | 分页、筛选、搜索 |
| $_POST | 表单 POST 体 | 提交表单、上传元数据 |
| $_FILES | 上传文件信息 | 文件上传 |
| $_COOKIE | 客户端 Cookie | 记住登录、偏好 |
| $_SESSION | 服务端会话 | 登录状态、购物车 |
| $_REQUEST | GET + POST + COOKIE 合并 | 不建议使用 |
| $_ENV | 环境变量 | 配置注入 |
$_REQUEST's sources depend on the request_order ini setting — unpredictable and risky. Use the specific array.$_GET 与 $_POST
Requesting http://localhost/info.php?name=Tom&age=18:
<?php
echo $_GET['name'] ?? '匿名', "\n";
echo $_GET['age'] ?? '-', "\n";
echo $_SERVER['REQUEST_METHOD'], "\n";
echo $_SERVER['QUERY_STRING'], "\n";
echo $_SERVER['SCRIPT_NAME'], "\n";Tom
18
GET
name=Tom&age=18
/info.phpOn form submission:
<?php
// 表单: <form method="post"><input name="user"><input name="pwd" type="password"></form>
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$user = trim($_POST['user'] ?? '');
$pwd = $_POST['pwd'] ?? '';
if ($user === '' || $pwd === '') {
echo "请填写完整\n";
} else {
echo "收到用户: " . htmlspecialchars($user), "\n";
echo "密码长度: " . strlen($pwd), "\n";
}
} else {
echo "请用 POST 提交\n";
}收到用户: Tom
密码长度: 8$_GET / $_POST into SQL or HTML.** Escape output with htmlspecialchars(), use prepared statements for the database.$GLOBALS
<?php
$x = 1;
function inc() {
$GLOBALS['x']++;
}
inc();
inc();
echo $x, "\n";3global $x; is the equivalent per-variable form. Better still: avoid globals and pass dependencies as arguments.
$_SERVER 常用键
| Key | Value |
|---|---|
| REQUEST_METHOD | GET / POST / PUT / DELETE |
| REQUEST_URI | 含查询串的完整路径 |
| SCRIPT_NAME | 当前脚本路径 |
| HTTP_HOST | 请求的域名 |
| REMOTE_ADDR | 客户端 IP |
| HTTP_USER_AGENT | 浏览器标识(可伪造) |
| HTTPS | 非空表示走 HTTPS |
| CONTENT_TYPE | 请求体类型,如 application/json |
REMOTE_ADDR is the direct peer address — the proxy's IP behind one. X-Forwarded-For carries the real client but can be forged; trust it only behind a trusted proxy.
JSON bodies are not in $_POST
For Content-Type: application/json PHP does not populate $_POST. Read the raw input stream yourself.
<?php
$raw = file_get_contents("php://input");
$data = json_decode($raw, true);
if (json_last_error() !== JSON_ERROR_NONE) {
http_response_code(400);
echo "非法 JSON\n";
exit;
}
echo "收到字段: " . implode(",", array_keys($data)), "\n";收到字段: name,agephp://input can be read repeatedly (5.6+), whereas the raw body is consumed once $_POST is parsed. This is the standard pattern for APIs.
九个超级全局变量
| 变量 | 内容 | 典型用途 |
|---|---|---|
| $GLOBALS | 所有全局变量 | 在函数里改全局变量 |
| $_SERVER | 服务器与请求信息 | 请求方法、URL、IP |
| $_GET | URL 查询串参数 | 分页、筛选、搜索 |
| $_POST | 表单 POST 体 | 提交表单、上传元数据 |
| $_FILES | 上传文件信息 | 文件上传 |
| $_COOKIE | 客户端 Cookie | 记住登录、偏好 |
| $_SESSION | 服务端会话 | 登录状态、购物车 |
| $_REQUEST | GET + POST + COOKIE 合并 | 不建议使用 |
| $_ENV | 环境变量 | 配置注入 |
$_REQUEST 的来源取决于 request_order 配置,行为不确定,还有安全风险。明确知道数据从哪来就用哪个数组。GET 与 POST
访问 http://localhost/info.php?name=Tom&age=18 时:
<?php
echo $_GET['name'] ?? '匿名', "\n";
echo $_GET['age'] ?? '-', "\n";
echo $_SERVER['REQUEST_METHOD'], "\n";
echo $_SERVER['QUERY_STRING'], "\n";
echo $_SERVER['SCRIPT_NAME'], "\n";Tom
18
GET
name=Tom&age=18
/info.php表单提交时:
<?php
// 表单: <form method="post"><input name="user"><input name="pwd" type="password"></form>
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$user = trim($_POST['user'] ?? '');
$pwd = $_POST['pwd'] ?? '';
if ($user === '' || $pwd === '') {
echo "请填写完整\n";
} else {
echo "收到用户: " . htmlspecialchars($user), "\n";
echo "密码长度: " . strlen($pwd), "\n";
}
} else {
echo "请用 POST 提交\n";
}收到用户: Tom
密码长度: 8$_GET / $_POST 的值拼进 SQL 或 HTML**。输出用 htmlspecialchars(),入库用预处理语句。这是 PHP 项目被打穿的两条主要路径。$GLOBALS
<?php
$x = 1;
function inc() {
$GLOBALS['x']++;
}
inc();
inc();
echo $x, "\n";3函数内访问全局变量还有 global $x; 的写法,效果等价但只对单个变量生效。更好的做法是别用全局变量,把依赖当参数传进去。
$_SERVER 常用键
| 键 | 值 |
|---|---|
| REQUEST_METHOD | GET / POST / PUT / DELETE |
| REQUEST_URI | 含查询串的完整路径 |
| SCRIPT_NAME | 当前脚本路径 |
| HTTP_HOST | 请求的域名 |
| REMOTE_ADDR | 客户端 IP |
| HTTP_USER_AGENT | 浏览器标识(可伪造) |
| HTTPS | 非空表示走 HTTPS |
| CONTENT_TYPE | 请求体类型,如 application/json |
REMOTE_ADDR 拿的是直连 IP,走代理时是代理的 IP。要取真实客户端 IP 得看 X-Forwarded-For,而那个头可以被伪造,只有在可信代理后面才能信。
JSON 请求体不在 $_POST 里
Content-Type: application/json 的请求,PHP 不会自动填充 $_POST。必须自己读原始输入流。
<?php
$raw = file_get_contents("php://input");
$data = json_decode($raw, true);
if (json_last_error() !== JSON_ERROR_NONE) {
http_response_code(400);
echo "非法 JSON\n";
exit;
}
echo "收到字段: " . implode(",", array_keys($data)), "\n";收到字段: name,agephp://input 可以重复读取(PHP 5.6+),而 $_POST 一旦被读过就不能再读流。写 API 时这是标准套路。