在 PHP 中,静态变量是一种特殊类型的变量,使用关键字 static
来声明。它们具备以下特性和用途:
- 生命周期与作用域
- 生命周期:静态变量在函数或类的第一次执行时被初始化,之后在脚本的整个生命周期内都持续存在,不会随着函数调用结束而销毁。这与普通局部变量形成鲜明对比,普通局部变量在函数执行完毕后就会从内存中清除。
- 作用域:静态变量的作用域限定在声明它的函数或类内部,外部无法直接访问。例如:
function testStatic() {static $count = 0;$count++;echo $count;
}testStatic(); // 输出 1
testStatic(); // 输出 2
每次调用 testStatic
函数时,$count
变量的值会在上一次调用结果的基础上累加,因为它一直存活在内存中,而不是每次都重新初始化为 0
。
- 类中的静态变量
- 在类里,静态变量归属于类本身,而非类的实例对象。所有类的实例共享这一静态变量。
class MyClass {static $sharedValue = 10;public function incrementSharedValue() {self::$sharedValue++;}
}$obj1 = new MyClass();
$obj2 = new MyClass();$obj1->incrementSharedValue();
echo MyClass::$sharedValue; // 输出 11
这里,通过类的任意实例修改静态变量 $sharedValue
,该类的所有实例访问此静态变量时都会看到更新后的值,因为它们指向同一个静态存储区。
- 静态变量的初始化
- 静态变量只会初始化一次,后续调用函数或者访问类时,不会再次执行初始化语句。而且初始化表达式必须是一个常量值,不能是函数调用或者变量,例如:
function wrongStaticInit() {static $var = rand(); // 错误,rand() 是函数调用//...
}
正确的做法是使用固定的常量、字面量来初始化,像 static $num = 5;
这种形式。
- 递归函数与静态变量
- 在递归函数中,静态变量非常有用。由于静态变量不会随递归调用重置,它可以用来记录递归的层级、状态等关键信息。
function recursiveFunction($n) {static $depth = 0;$depth++;if ($n > 0) {recursiveFunction($n - 1);}$depth--;return $depth;
}
上述函数里,$depth
借助静态变量的特性,准确记录递归的深度,让开发者能更好把控递归流程。