static变量在函数内只初始化一次,后续所有调用(含循环内多次调用)均复用并修改同一值;循环中反复调用含static变量的函数时,该变量持续累加而非每次重置。

会变,而且是“持续变”——但不是每次循环都重置,而是整个函数生命周期内只初始化一次,后续所有调用(包括循环内多次调用)都复用并修改同一个值。
static变量在for/while循环里被反复调用时的行为
很多人误以为写在for循环体内的函数调用,其内部的static变量会“随循环重来”,其实完全相反:只要该函数被循环调用了N次,它的static变量就累加/更新N次,且中间不重置。
- 错误直觉:
for ($i = 0; $i → 以为每次进<code>counter()时static $n = 0都会执行 - 真实行为:
static $n = 0仅在第一次调用counter()时执行;第二次起直接跳过初始化,读取上一次退出时的$n值 - 典型后果:输出是
1、2、3,而不是重复的1
为什么不能在static初始化中用函数调用或变量
PHP编译期就要求static变量的初始值必须是“编译时确定”的字面量或常量,比如0、'abc'、__FILE__。任何运行时才能求值的表达式都会报错:
-
static $ts = time();→Parse error: syntax error, unexpected 'time' -
static $cfg = parse_ini_file('config.ini');→ 同样非法 - 正确写法只能是:
static $ts = 0;,然后在函数体内首次检查是否为初始值,再手动赋值:if ($ts === 0) $ts = time();
CLI模式下循环调用和Web请求的区别
这个差异直接影响你是否“看到值在变”:
- CLI脚本中跑
for循环100次 →static变量从1累加到100,全程可见 - Web环境(PHP-FPM/Apache)中,每个HTTP请求是独立进程 → 即使前端循环发10个AJAX请求,每个请求里的
static都是全新初始化的,彼此不共享 - 容易踩坑:在CLI里调试好逻辑,上线后发现“计数没延续”,其实是环境切换导致的预期错位
递归调用中static变量怎么表现
递归本质也是“多次调用同一函数”,所以static变量同样跨层级保留状态:
- 斐波那契函数里用
static $cache = [];做记忆化,每次递归进入都复用同一个$cache数组 - 但要注意:如果递归很深,缓存键爆炸式增长,
$cache会一直占着内存不释放,直到整个请求结束 - 别指望用
static在递归里做“每层独立计数”——它天生就是全局(函数级)共享的,要分层就得传参或用引用
最易被忽略的一点:你无法从函数外部重置一个static变量,也没有反射API能直接访问它。想清空?只能在函数内部暴露清理逻辑,比如加个if (func_num_args() && func_get_arg(0) === 'reset')分支——否则它就在那儿,安静地、固执地,记着上次的值。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











