程序里的变量,最直观的理解就是一个个贴着标签的容器——你把数据放进去,后面随时可以取出来用。PHP 的变量体系有自己的规则和脾气,从命名格式到作用范围,掌握它们是写出稳定代码的基本功。
变量命名的硬规则
PHP 变量有几条必须遵守的铁律,记牢了对后面写代码有好处:
-
所有变量名必须以美元符号
$开头,后面紧跟变量名,中间不能有空格。 -
变量名只能包含字母、数字和下划线(
a-z、A-Z、0-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声明,仅在第一次调用时初始化,之后的调用会保留上一次的值,适合计数和状态缓存。