← PHP 类型提示:让函数只接受该接受的数据 PHP MySQL数据库连接:从mysqli_connect开始 →

PHP 变量与作用域:从声明规则到三种可见范围

原创 2026-05-12 PHP 已有人查阅

程序里的变量,最直观的理解就是一个个贴着标签的容器——你把数据放进去,后面随时可以取出来用。PHP 的变量体系有自己的规则和脾气,从命名格式到作用范围,掌握它们是写出稳定代码的基本功。

变量命名的硬规则

PHP 变量有几条必须遵守的铁律,记牢了对后面写代码有好处:

  • 所有变量名必须以美元符号 $ 开头,后面紧跟变量名,中间不能有空格。

  • 变量名只能包含字母、数字和下划线(a-zA-Z0-9_),不能以数字开头

  • 变量名是区分大小写的——$sum 和 $SUM 在 PHP 眼里是两个不同的变量。

  • 赋值用 = 运算符,变量在左边,值或表达式在右边。

PHP 是一门松散类型语言(loosely typed language),声明变量时不需要指定类型,PHP 会根据你赋的值自动推断。这一点和 Java、C++ 这类强类型语言有根本区别——初期上手更灵活,但同时也更依赖开发者自己对类型的把控。

看一个变量声明的综合例子:

$val = 5;
$val2 = 2;
$op_qr_st = "string";
$_QWERT = "new string";

echo $val;
echo "<br>";
echo $val2;
echo "<br>";
echo $op_qr_st;
echo "<br>";
echo $_QWERT;

// 下面两个都是非法声明
// $10_val = 56;      // 数字开头,不允许
// $f.d = "num";      // 包含点号,只允许下划线

输出:

5
2
string
new string

$_QWERT 以下划线开头是合法的,这也是很多 PHP 内置变量(比如 $_GET$_POST$_SESSION)的命名习惯。另外提一句,常量(Constants)的值在设定后就不能修改,而且常量名通常全大写,这是 PHP 社区比较统一的约定。

变量的三种作用域

作用域(Scope)决定了变量在程序的哪些地方能被访问。PHP 有三种作用域:局部(Local)全局(Global)静态(Static)。三种机制各有各的规矩,理解清楚它们的边界,能帮你绕开很多变量相关的 bug。

局部变量:函数内部的私产

在函数内部声明的变量就是局部变量,它的生命周期仅限于该函数内部。函数执行完毕,这些变量就被销毁。即使函数外部有一个同名变量,它们在内存中也是两个独立的实体,互不干扰。

$num = 60;

function local_var() {
    $num = 50;
    echo "local num = $num \n";
}

local_var();
echo "Variable num outside local_var() is $num \n";

输出:

local num = 50
Variable num outside local_var() is 60

函数内的 $num = 50 和外部的 $num = 60 没有任何关系,它们住在不同的作用域里。我刚学 PHP 时就在这里栽过跟头——以为函数内改了 $num 外部也会跟着变,结果排查了半小时才发现作用域在捣鬼。

全局变量:用 global 关键词跨越边界

在函数外部声明的变量默认处于全局作用域。但是,如果你在函数内部想访问外部的全局变量,必须用 global 关键词显式引入,否则函数根本看不见它。

$num = 20;

function global_var() {
    global $num;
    echo "Variable num inside function : $num \n";
}

global_var();
echo "Variable num outside function : $num \n";

输出:

Variable num inside function : 20
Variable num outside function : 20

如果没有 global $num; 这一行,函数内部会认为 $num 是一个未初始化的局部变量,和外面的 $num 毫无关系。除了 global 关键词,还可以通过 $GLOBALS 超全局数组来访问全局变量,比如 $GLOBALS['num'],这种方式在某些场景下可读性更好。

静态变量:跨函数调用保持记忆

普通局部变量在函数执行结束后就消失了。但如果你希望一个变量在多次调用之间“记住”上一次的值,就需要 static 关键词。静态变量只在第一次调用时初始化,之后每次调用都会保留上一次的结果。

function keep_track() {
    static $count = 0;
    $count++;
    print $count;
    print "<br/>";
}

keep_track();
keep_track();
keep_track();

输出:

1
2
3

每次调用 keep_track()$count 都在上一次的基础上继续累加,而不是每次从 0 开始。这是因为静态变量被存放在不同的内存区域,函数结束时不会被销毁。

再对比一下静态变量和普通变量的行为差异:

function static_var() {
    static $num = 5;   // 静态变量,只初始化一次
    $sum = 2;          // 普通局部变量,每次调用重新初始化

    $sum++;
    $num++;

    echo "Static num: $num<br>";
    echo "Normal sum: $sum<br><br>";
}

static_var();
static_var();

输出:

Static num: 6
Normal sum: 3

Static num: 7
Normal sum: 3

$num 从 5 开始,第一次调用变成 6,第二次变成 7,步步递增。而 $sum 每次都是从 2 起步,加完变成 3 后就结束了,下一次调用又回到 2 重新开始。这个对比很直观地展示了 static 的作用——保留状态。

静态变量在哪些场景下实用?典型的比如:计数器(记录某个事件被触发的次数)、缓存(函数内计算结果不想反复计算)、单例模式中的实例持有等。不过也要提醒一句,静态变量会常驻内存,滥用可能导致资源占用偏高,所以在确实需要跨调用保持状态时才用它。

本节课程知识要点

  • PHP 变量以 $ 开头,只能包含字母、数字和下划线,不能以数字开头,严格区分大小写。

  • PHP 是松散类型语言,变量声明时无需指定数据类型,类型由赋值自动推断。

  • 局部变量在函数内部声明,仅在函数内部可见,函数结束后销毁。

  • 全局变量在函数外声明,需要在函数内通过 global 关键词或 $GLOBALS 数组引入才能访问。

  • 静态变量用 static 声明,仅在第一次调用时初始化,之后的调用会保留上一次的值,适合计数和状态缓存。

← PHP 类型提示:让函数只接受该接受的数据 PHP MySQL数据库连接:从mysqli_connect开始 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号