🧠 PHP 变量从零开始讲明白(小白也能看懂)

🧠 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 的变量看似简单,但作用域、引用、静态变量、超全局变量等机制非常重要。掌握它们,才能写出健壮、稳定的代码。

相关推荐
@ chen18 分钟前
Spring Boot 解决跨域问题
java·spring boot·后端
转转技术团队1 小时前
转转上门隐私号系统的演进
java·后端
【本人】2 小时前
Django基础(二)———URL与映射
后端·python·django
Humbunklung2 小时前
Rust 模块系统:控制作用域与私有性
开发语言·后端·rust
WanderInk3 小时前
依赖对齐不再“失联”:破解 feign/BaseBuilder 错误实战
java·后端·架构
LaoZhangAI4 小时前
GPT-4o mini API限制完全指南:令牌配额、访问限制及优化策略【2025最新】
前端·后端
LaoZhangAI4 小时前
FLUX.1 API图像尺寸设置全指南:优化生成效果与成本
前端·后端
Kookoos4 小时前
ABP VNext + EF Core 二级缓存:提升查询性能
后端·.net·二级缓存·ef core·abp vnext
月初,5 小时前
SpringBoot集成Minio存储文件,开发图片上传等接口
java·spring boot·后端
星释5 小时前
WAMP允许远程访问
php·apache·wamp