php静态变量严格绑定于函数或类上下文,初始化仅一次且作用域受限:函数内static变量外部不可见,类中static属性属类本身、所有实例共享;其生命周期限于单次请求,不跨请求持久化。

PHP静态变量不是“定义一次、全局可用”的东西,它严格绑定在函数或类的上下文中,且初始化只发生一次——这是最关键的判断。
函数内声明 static $var 的行为
在函数体内部用 static 关键字声明变量,比如 static $count = 0;,这个变量不会随函数退出而销毁,但外部完全不可见。
- 初始化仅在第一次执行到该行时触发,后续调用跳过赋值表达式(哪怕右边是
time()或rand()) - 作用域仍限于函数体内,
$count在函数外无法被echo $count访问 - 每次调用函数时,它延续上一次结束时的值,不是“重置后累加”
- 常见误用:把它当全局计数器用,结果多个并发请求共享同一份值(在 FPM Worker 内确实如此,但不同 Worker 间不共享)
类中定义 public static $prop
类级别的静态属性属于类本身,所有实例共享同一内存地址,通过 ClassName::$prop 或 self::$prop 访问。
- 必须用
public、protected或private修饰,不能裸写static $prop - 初始化表达式只在类首次加载时执行一次,不是每次 new 实例时执行
-
self::$prop在类内部访问,static::$prop支持后期静态绑定(Late Static Binding),子类继承后可指向子类自己的静态属性 - 私有静态属性不能从外部直接读写,必须通过
public static方法暴露访问接口
static 变量和 global 的根本区别
别因为都“跨调用保持”就混用 static 和 global——它们底层存储位置和线程安全性完全不同。
-
static $x存在函数专属的“静态变量表”,每个 FPM Worker 进程独立一份,天然隔离 -
global $x指向全局符号表,所有 Worker 共享(若用 opcache + APCu 等扩展可能更复杂) -
static不污染全局命名空间,global容易引发命名冲突和意外覆盖 - 在 CLI 模式下多次调用同一函数,
static值会持续累积;但 Web 请求每次都是新进程/线程,所以“累积”只在单次请求内有意义
最易被忽略的一点:静态变量的生命周期不是“脚本运行期间”,而是“请求周期内”。页面刷新、API 重试、CLI 脚本重启,都会让所有 static 变量重新初始化。别指望它跨请求存状态——那得用 Redis、数据库或 session。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











