php静态变量仅在函数首次执行到该行时初始化一次,后续调用直接复用内存中值;它存储于zend静态存储区,生命周期限于单次请求,不跨http请求,作用域仅限函数内部。

因为静态变量在函数第一次执行到它那行时初始化,之后所有调用都跳过初始化,直接复用内存中已存在的值。
static 变量只初始化一次,不是每次调用都重置
普通局部变量每次进入函数都会重新分配栈空间、重新赋值;static 变量则被编译器/Zend 引擎识别为“需持久化”,首次执行 static $x = time(); 时计算并存储结果,后续调用完全不执行右侧表达式——哪怕写成 static $now = date('Y-m-d');,所有调用看到的都是第一次调用时的日期。
- 常见错误现象:
static $cache = get_data_from_api();在高并发下可能返回过期数据,因为首次请求后就再不会刷新 - 初始化表达式必须是编译期可确定的常量或简单标量,
static $arr = [func()];会报 Parse error - PHP 7.4+ 支持类型声明,如
static int $count = 0;,但类型检查仅在赋值时触发,不改变初始化逻辑
它的存储位置和生命周期与普通变量不同
static 变量不存于栈(stack)或堆(heap),而是分配在 Zend 执行器的静态存储区(EG(static_variables)),该区域随请求开始而初始化,随请求结束而销毁。所以它跨函数调用,但不跨 HTTP 请求。
- 不能用于跨请求缓存(比如想靠
static $user_id记住用户登录态——不行,下次请求就没了) - 递归函数中使用
static要格外小心:所有递归层级共享同一个变量,不是每层一份 - CLI 模式下若长期运行(如守护进程),
static变量会持续累积,可能引发内存泄漏
别把它和类中的 static 属性混为一谈
函数内 static $x 和类中 public static $x 完全是两套机制:前者绑定函数作用域,后者属于类本身、所有实例共享、可通过 self:: 或 ClassName::$x 访问。
- 函数内
static无法在函数外访问,连global都导不出 - 类方法里写
static $tmp是合法的,但它和该类的static属性无关,仍是函数私有状态 - 闭包中使用
static变量,行为一致——只初始化一次,且绑定在该闭包实例上
最容易被忽略的是:它看起来像“函数内部的全局变量”,实际却是 Zend VM 管理的一块独立内存槽位,既不参与引用计数清理,也不受作用域链影响——只要函数被调过,那个槽位就一直占着,直到请求结束。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











