PHP类方法内不可用static $x声明静态变量,会直接报Parse error;必须用private static $counter等类级静态属性替代,且其值仅限单次请求生命周期。

类方法里写 static $x 会直接报错
PHP 7.2 不允许在类的方法体内使用 static $x = 0; 这种语法。这不是兼容性问题,而是语法错误——解析器会在 public function foo() { static $x; } 这一行就抛出 Parse error: syntax error, unexpected 'static'。
常见错误现象:复制了函数内静态变量的写法,粘贴到类方法里,结果整个文件无法加载。
- 只有独立函数(非类成员)才支持方法体内的
static变量声明 - 类中想保持跨调用状态,必须改用
private static $counter这类类级静态属性 - 不能靠“加个
static关键字”就让普通方法变量变持久,这是根本性语法限制
self::$var 和 static::$var 在 PHP 7.2 的行为差异
PHP 7.2 已支持后期静态绑定(LSB),但 self:: 和 static:: 的区别极易踩坑,尤其在继承场景下。
假设父类 A 有 private static $name = 'A';,子类 B extends A 重定义了同名属性:
立即学习“PHP免费学习笔记(深入)”;
- 在
A::getName()中写return self::$name;→ 永远返回'A'(编译时绑定) - 同样位置写
return static::$name;→ 调用B::getName()时返回'B'(运行时绑定) - 如果子类没重定义该属性,
static::$name仍会回退到父类的值,不是空或报错
PHP 7.2 下静态属性初始化的限制
PHP 7.2 不支持在静态属性声明时使用函数调用或复杂表达式,比如 public static $config = json_decode(file_get_contents('a.json')); 是非法的,会触发 Parse error。
正确做法是延迟初始化,在首次访问时判断并赋值:
class Config {
private static $data = null;
public static function get() {
if (self::$data === null) {
self::$data = json_decode(file_get_contents('config.json'), true);
}
return self::$data;
}
}- 不能依赖
public static $x = some_function();—— PHP 7.2 不允许 - 数组字面量如
public static $list = [1, 2, 3];是允许的(PHP 5.6+ 支持) - 常量表达式如
public static $limit = 100 * 2;也可用,但不能含函数调用
静态变量生命周期只限单次请求,别当缓存用
PHP 7.2 运行在 FPM 或 CGI 模式下时,每个请求都是独立进程,static 属性的值绝不会跨请求保留。有人误以为它能替代 Redis 或 APCu,结果发现计数器每次都是 0。
容易被忽略的地方:
- CLI 脚本执行一次,静态值只活这一次;再跑一遍脚本,又是全新开始
- Web 请求间完全隔离,哪怕同一个用户连续刷新,
self::$hit_count++也毫无意义 - 若真需要跨请求状态,必须显式用外部存储(文件、数据库、Redis)



















