静态变量在函数内仅初始化一次且保留上次调用值,作用域限于该函数,不跨请求、不共享于多函数,非全局变量;类中static属性与函数内static变量本质不同,不可混淆。

静态变量在函数内部声明后会保留上次调用的值
PHP 的 static 关键字用于函数内变量时,该变量只初始化一次,后续调用不重置。这不是“全局变量”,而是绑定在函数作用域内的持久存储。
- 第一次调用函数时初始化(如
static $count = 0;),之后每次进入函数,$count都是上一次退出时的值 - 不能在类方法外、函数外使用
static声明变量(会报Parse error: syntax error) - 初始化表达式只执行一次,哪怕写成
static $now = time();,所有调用看到的都是首次调用时的时间戳
静态变量不共享于多个函数,也不跨请求存在
每个函数拥有自己独立的静态变量空间,且 PHP 的每个请求是隔离的——FPM 或 CLI 每次执行都是一次全新生命周期。
- 函数
foo()和bar()各自的static $x互不影响 - Web 请求中,A 用户调用
counter()5 次,B 用户第一次调用仍是初始值,不是 6 - CLI 脚本里多次调用函数,静态变量才体现“跨调用”效果;但脚本结束,值就消失
类中 static 变量和函数内 static 变量完全不是一回事
别被名字误导:static $prop 在类中是“类级别变量”,属于类本身;而函数内的 static $var 属于“单个函数的闭包状态”,两者作用域、生命周期、访问方式都不同。
- 类静态属性用
self::$prop或ClassName::$prop访问,函数内静态变量只能在该函数体内读写 - 类静态属性可被继承、覆盖(
staticvsself有差异),函数内静态变量无继承概念 - 错误地把函数内静态变量当成“轻量单例”来缓存对象?小心内存泄漏——它不会随请求结束自动销毁引用的对象
常见误用:试图用静态变量替代缓存或状态管理
比如在 Laravel 或 Symfony 的控制器方法里写 static $cache = [];,期望跨请求复用数据——这行不通,而且容易掩盖并发问题。
立即学习“PHP免费学习笔记(深入)”;
- 静态变量无法解决多进程/多线程下的竞争条件,PHP-FPM 下多个 worker 进程各自持有一份
- 想缓存计算结果?用
apcu_store()/apcu_fetch()或 Redis;想保持用户状态?用 session 或数据库 - 调试时发现静态变量“有时变、有时不变”?大概率是没意识到 CLI 多次执行 ≠ Web 多次请求,或混淆了命令行交互模式(如 psysh)的持久上下文











