1 概述
静态变量(Static Variable)是一种在程序运行时只分配一次内存的变量,它们属于类,而不是类的任何特定实例。 静态变量使用 static 关键字声明。这意味着无论创建了多少类的实例,类的所有实例都共享同一个静态变量。这些特性使得静态变量非常适用于存储类级别的信息或常量值。
2 特点
- 类级别的变量:静态变量属于类,而不是对象实例。这意味着所有实例共享相同的静态变量。
- 全局访问:静态变量可以在不创建类实例的情况下访问。
- 内存管理:静态变量在程序启动时创建,在程序结束时销毁。
- 默认值:如果未显式初始化,静态变量会被赋予其类型的默认值(例如,数值类型的默认值是 0,布尔类型的默认值是 false,对象引用的默认值是 null)。
3 实例
function track_time_called() { static $i ; $i++; return $i; } $i = track_time_called(); var_dump($i);//1 $i = track_time_called(); var_dump($i);//2 $i = track_time_called(); var_dump($i);//3
/* 在这个示例中,无论创建多少个 MyClass 的实例,staticCounter 都是同一个变量,它的值会随着每个新实例的创建而增加。而 instanceCounter 是一个实例变量,它对每个实例都是独立的。 */ class MyClass { // 静态变量 static public $staticCounter =100 ; // 实例变量 public $instanceCounter = 100; public function myFun() { self::$staticCounter ++; $this->instanceCounter++; } } $myObj = new MyClass(); $myObj->myFun(); var_dump(MyClass::$staticCounter);//int(101) var_dump($myObj->instanceCounter);//int(101) $myObj->myFun(); var_dump(MyClass::$staticCounter);//int(102) var_dump($myObj->instanceCounter);//int(102) $myObj2 = new MyClass(); $myObj2->myFun(); var_dump(MyClass::$staticCounter);//int(103) var_dump($myObj2->instanceCounter);//int(101)
4 使用场景
- 全局计数器或共享数据
- 常量值(通常与 final 关键字结合使用)
- 单例模式(确保类只有一个实例)
- 实用工具或帮助方法(不依赖于类实例的状态)
5 注意事项
在多线程环境下使用静态变量时要特别小心,因为静态变量由所有线程共享,可能导致数据不一致性和线程安全问题。在这种情况下,您可能需要同步机制来保证静态变量的线程安全。