PHP 8.1+ 强制静态属性必须显式声明访问修饰符,如 public static int $count = 0;PHP 8.0 允许但会触发弃用警告,不建议使用。

PHP 8.0 及以后版本(特别是从 PHP 8.1.0 起)**不允许省略静态属性的访问控制修饰符**,也就是说,不能像 PHP 7.x 那样写 static $count; 默认为 public。这种写法在 PHP 8.1+ 中会直接报错。
PHP 8.1+ 强制要求显式声明访问控制
自 PHP 8.1.0 开始,所有类属性(包括静态属性)都必须明确使用 public、protected 或 private 之一修饰。否则会触发致命错误:
Parse error: Syntax error, unexpected '$count', expecting function (T_FUNCTION) or const (T_CONST) or ...- 即使加上
static,若没写访问修饰符,语法即不合法
PHP 8.0 是过渡期,但已发出严格警告
PHP 8.0 允许省略修饰符的静态属性写法(如 static $count = 0;),但会触发 Deprecated 警告:
- 提示类似:
Deprecated: Implicitly marking property ... as public is deprecated - 该写法虽能运行,但属于“即将被移除”的行为,不建议在新项目中使用
- 实际开发中应视同不可用,提前按 PHP 8.1 规则整改
正确写法示例(PHP 8.0+ 兼容)
以下写法在 PHP 8.0 和 8.1+ 均有效且无警告:
PHP 8.5.12 RC 1 候选版修复 BZ2、DOM、PDO、Opcache/JIT 和扩展内存安全问题,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
立即学习“PHP免费学习笔记(深入)”;
-
public static int $count = 0;(推荐,显式、带类型) private static string $version = '1.0';protected static array $cache = [];
注意:类型声明(如 int)是可选的(PHP 7.4+ 支持),但访问修饰符 不可省略。
为什么必须显式声明?
这是 PHP 向更严格、更可维护的面向对象设计演进的关键一步:
- 避免意外暴露内部状态(过去默认 public 容易导致封装失效)
- 提升 IDE 支持与静态分析准确性(如 PHPStan、Psalm)
- 统一类成员声明风格,与方法、常量、构造器提升等特性对齐


















