🧠 PHP 变量从零开始讲明白(小白也能看懂)
1️⃣ 什么是变量?
变量就像一个"盒子",你可以把数据放进去,然后通过名字找到它。
ini
$name = "张三";
echo $name; // 输出:张三
变量名前面必须加 $
,不能以数字开头,建议使用英文命名。
2️⃣ 变量的作用域(Scope)
作用域就是变量能被访问的范围。
✅ 全局作用域(Global Scope)
在函数外定义的变量,可以在脚本的大部分地方使用。
php
$age = 25;
function showAge() {
echo $age; // 报错!因为函数内部看不到全局变量
}
要访问全局变量,需要使用 global
或 $GLOBALS
:
php
function showAge() {
global $age;
echo $age; // 输出 25
}
✅ 局部作用域(Function Scope)
在函数内部定义的变量,外部无法访问。
php
function sayHello() {
$msg = "你好";
}
echo $msg; // 报错!局部变量不能在外部访问
✅ 静态作用域(Static Scope)
使用 static
关键字可以让变量在函数多次调用之间保留值。
scss
function countVisit() {
static $count = 0;
echo $count;
$count++;
}
countVisit(); // 输出 0
countVisit(); // 输出 1
countVisit(); // 输出 2
📌 注意:
- 静态变量只初始化一次;
- 从 PHP 8.3 开始,可以用函数初始化静态变量:
scss
function foo() {
static $num = sqrt(121); // 自 PHP 8.3 起合法
}
✅ 继承方法中的静态变量(PHP 8.1+)
从 PHP 8.1 开始,子类继承的方法和父类共享同一个静态变量:
scala
class Foo {
public static function counter() {
static $count = 0;
return ++$count;
}
}
class Bar extends Foo {}
Foo::counter(); // 1
Bar::counter(); // 2 ← 和父类共享
3️⃣ 超全局变量(Superglobals)
这些变量在任何地方都可以访问 ,不需要 global
。
名称 | 描述 |
---|---|
$GLOBALS |
所有全局变量的引用 |
$_SERVER |
服务器信息(如 IP、URL) |
$_GET |
接收 URL 中传递的数据(GET 请求) |
$_POST |
接收表单提交的数据(POST 请求) |
$_FILES |
接收上传文件的信息 |
$_REQUEST |
包含 GET、POST、COOKIE 的合并数据 |
$_SESSION |
存储用户登录状态等会话数据 |
$_ENV |
获取环境变量 |
$_COOKIE |
获取客户端 Cookie 数据 |
📌 这些变量都是数组形式,比如:
php
echo $_SERVER['HTTP_HOST']; // 输出当前域名
4️⃣ 可变变量(Variable Variables)
可以将一个变量的值作为另一个变量的名字:
php
$a = "hello";
$$a = "world"; // 相当于 $hello = "world"
echo $hello; // 输出 world
echo "$a {$hello}"; // 输出 hello world
5️⃣ 最佳实践建议
场景 | 推荐做法 |
---|---|
想在函数中使用全局变量 | 使用 $GLOBALS 更安全 |
想让变量在函数多次调用间保留 | 使用 static |
想跨类共享计数器 | 使用类的静态属性(private static $count ) |
不要滥用 & 引用 |
容易造成悬空引用,影响稳定性 |
📄 附录:常见陷阱提醒
错误写法 | 问题 | 正确写法 |
---|---|---|
global $var = &someFunc(); |
局部变量销毁后引用失效 | 不要用引用赋值给 global |
static $var = someFunc(); (PHP < 8.3) |
不允许动态表达式 | 升级到 PHP 8.3 后可用 |
$$a = "value" |
如果 $a 是空或不可预测的,可能导致错误 |
确保 $a 有值再使用可变变量 |
📌 总结一句话:
PHP 的变量看似简单,但作用域、引用、静态变量、超全局变量等机制非常重要。掌握它们,才能写出健壮、稳定的代码。