变量作用域指的是变量在程序中可被访问的范围。PHP 的作用域主要分为 全局作用域全局作用域、局部作用域、静态作用域、超全局变量。
1. 全局作用域
-
在函数外部定义的变量属于全局作用域;
-
全局变量在函数内部不能直接访问,必须使用
global
关键字或$GLOBALS
数组。
示例:
<?php$greeting="你好";functionsayHello() {global$greeting; // 或使用 $GLOBALS['greeting']echo$greeting;}sayHello(); // 输出:你好?>
2. 局部作用域
在函数内部定义的变量只能在函数内部使用;函数外部无法访问该变量。
示例:
<?phpfunctiontest() {$name="风铃";echo$name;}test(); // 输出:风铃echo$name; // ❌ 报错:变量未定义?>
3. 静态作用域
使用 static
关键字定义的局部变量,会在函数调用之间保持其值;不会像普通局部变量那样每次调用都重新创建。
<?phpfunctioncounter() {static$count=0;$count++;echo$count . "<br>";}counter(); // 输出:1counter(); // 输出:2counter(); // 输出:3?>
4. 超全局变量
PHP 内置了一些 在任何作用域下都可以访问的全局数组变量,如:
-
$_GET
-
$_POST
-
$_SERVER
-
$_COOKIE
-
$_SESSION
-
$_FILES
-
$_ENV
-
$_REQUEST
-
$_GLOBALS
这些变量在函数内外都可以直接使用,无需声明。
超全局变量 | 描述 |
---|---|
$_GET |
用于接收通过 URL 传递的参数(GET 请求) |
$_POST |
用于接收通过表单提交的参数(POST 请求) |
$_REQUEST |
同时接收 $_GET 、$_POST 和 $_COOKIE 的值 |
$_SERVER |
包含服务器和执行环境信息 |
$_FILES |
处理上传的文件信息 |
$_ENV |
包含环境变量信息 |
$_COOKIE |
接收客户端发送的 Cookie 数据 |
$_SESSION |
用于会话管理 |
$_GLOBALS |
用于访问全局作用域中的变量 |
http_response_header |
包含最后一次 HTTP 请求的响应头信息(不常用) |
1. $_GET
// URL: scope.php?name=Fenglingecho$_GET['name']; // 输出 Fengling
2. $_POST
<formmethod="post"><inputtype="text"name="username"><inputtype="submit"></form><?phpecho$_POSTs['name'];?>
3. $_REQUEST
可以同时获取 GET / POST / COOKIE 中的值
<formmethod="post"><inputtype="text"name="username"><inputtype="submit"></form><?phpecho$_REQUEST['username'];?>
图一为GET、图二为POST
4. $_SERVER
<?PHPecho$_SERVER['SERVER_NAME']; // 输出服务器名称echo$_SERVER['REQUEST_METHOD']; // 请求方式:GET 或 POST ?>
4. $_SERVER
$_SERVER
获取服务器/请求相关信息
示例:
<formmethod="post"><inputtype="text"name="username"><inputtype="submit"></form><?PHPecho$_REQUEST['username'] . "<br>";echo$_SERVER['SERVER_NAME'] . "<br>"; // 输出服务器名称echo$_SERVER['REQUEST_METHOD']; // 请求方式:GET 或 POST ?>
5. $_FILES
处理上传的文件信息
<formmethod="post"enctype="multipart/form-data"><inputtype="file"name="myfile"><inputtype="submit"></form><?phpecho$_FILES['myfile']['name']; // 输出上传的文件名?>
6. $_COOKIE
和 $_SESSION
$_COOKIE
接收客户端发送的 Cookie 数据,$_SESSION
用于进行会话管理。
// 设置 cookiesetcookie("user", "Tom", time()+3600);echo$_COOKIE['user']; // 读取 cookie// 使用 sessionsession_start();$_SESSION['user'] ="Tom";echo$_SESSION['user'];
这段代码涉及到 PHP 中两个非常重要的“会话保持机制” ——Cookie
和 Session
,
setcookie("user", "Tom", time()+3600);
含义是:在浏览器中保存一个名为 user
的 cookie,值为 Tom
,1 小时后过期(time()+3600
表示当前时间 + 3600 秒)。
session_start();
它会创建或恢复一个“用户会话”,并自动管理一个叫做 PHPSESSID
的 cookie。
$_SESSION['user'] = "Tom";
把字符串 Tom
保存到服务器的 Session 中,键名是 user
。
Cookie 和 Session 的区别总结
项目 | Cookie | Session |
---|---|---|
存储位置 | 浏览器(客户端) | 服务器端 |
安全性 | 较低(用户可以修改) | 较高(用户无法直接修改) |
典型用途 | 记住用户名、自动登录 | 登录验证、购物车、用户状态 |
是否依赖浏览器 | 是 | 间接依赖(通过 Cookie 存储 Session ID) |
Cookie 和 Session 是 PHP 中的两种会话机制。Cookie 把数据保存在客户端浏览器中,适合存储一些不太敏感的信息;而 Session 把数据保存在服务器端,更适合保存登录状态等私密数据。
7. $_GLOBALS
用于访问全局作用域中的变量
<?php$name="风铃";$animal="cat";functionshowName() {echo$GLOBALS['name']; // 访问函数外的变量echo$GLOBALS['animal'];}showName(); // 输出:风铃?>
unset和isset函数
unset()可以删除变量,isset() 可以判断变量是否存在
<?php$name="风铃";functiontest(){$age="35";var_dump(isset($age));unset($age);var_dump(isset($age));}test();var_dump($name);?>
总结
变量作用域是 PHP 编程中一个基础却关键的概念,正确理解全局变量、局部变量、静态变量以及超全局变量的作用域,有助于我们编写结构清晰、逻辑严谨的程序。希望这篇文章能帮助你夯实基础,在后续的函数与模块化开发中更加得心应手。
原文始发于微信公众号(风铃情报站):PHP基础-变量作用域
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论