静态变量必须用static关键字声明,属于类而非实例,需用self::或类名::访问,不可用$this->,生命周期贯穿请求,注意内存与并发风险。

静态变量声明必须用 static 关键字,不能省略
PHP 类中声明静态变量时,static 是语法强制要求,漏写会直接报错 Parse error: syntax error, unexpected 'public'(或类似)。它和普通属性不同,不隶属于实例,而是属于类本身。
常见错误是把 public $count = 0 当成静态变量用,结果每次 new 一个新对象就重置——这根本不是静态行为。
- 正确写法:
private static $counter = 0; - 错误写法:
private $counter = 0;(这是实例变量) - 静态变量不能用
var声明(已废弃),也不支持const替代(const是只读的)
访问静态变量必须用 self:: 或 static::,不能用 $this->
$this 指向当前实例,而静态变量不存在于实例中,所以用 $this-> 访问静态变量会触发 Fatal error: Access to undeclared static property。必须用作用域解析符 ::。
在类内部访问时,优先用 self::(指向定义该代码的类),慎用 static::(后期静态绑定,可能指向子类)——除非你明确需要继承时覆盖行为。
立即学习“PHP免费学习笔记(深入)”;
- 读取:
self::$counter、static::$counter - 写入:
self::$counter++ - 绝对不要:
$this->counter(报错)或$this->$counter(变量名解析错误)
外部调用静态变量要用类名加 ::,不能用对象实例
从类外部访问静态变量,必须通过类名,例如 MyClass::$count。用对象来调用(如 $obj->count 或 $obj::$count)虽然在 PHP 7+ 中部分允许,但语义混乱、易出错,且 PHP 8.2 起已弃用 $obj::$prop 语法。
更隐蔽的问题是:如果类未被加载(比如没 require 或自动加载失败),直接 MyClass::$count 会触发 Class 'MyClass' not found,而不是静默失败。
- 推荐写法:
MyClass::$counter - 危险写法:
$obj::$counter(PHP 8.2+ 报Deprecated) - 注意:静态变量不支持 public 访问控制以外的权限绕过——
private static从外部永远不可见
静态变量生命周期贯穿整个请求,注意内存与并发风险
静态变量在脚本执行期间一直存在,不会随对象销毁而释放。这意味着它可能累积数据、占用内存,或在 CLI 多次调用、FPM 多 worker 场景下引发意料外的状态污染。
尤其要注意:PHP-FPM 下每个 worker 进程独立维护一份静态变量副本;CLI 模式下多次 php script.php 是不同进程,互不影响;但同一个 long-running 进程(如 Swoole)里,静态变量会跨请求保留——这点极易被忽略。
- 别在静态变量里存大数组或资源句柄(如
mysqli连接) - Web 环境中避免依赖静态变量做“全局计数器”,除非配合锁或原子操作
- 测试时记得
unset($obj)不会影响self::$counter,得靠手动重置或重构逻辑










