php静态属性必须用static关键字在类内声明,仅支持public/protected/private修饰符,初始化限于编译期确定值,子类同名声明会隔离父类静态属性。

PHP静态属性怎么写才合法
必须用 static 关键字修饰,且只能在类内部声明,不能在方法里或全局作用域写。漏掉 static 或错放在函数内,会直接报 Parse error: syntax error。
-
public static $count = 0;✅ 合法,访问修饰符 +static+ 变量名 -
static $count = 0;✅ 合法(默认public,但不推荐省略) -
public $count = 0;❌ 不是静态属性,只是普通属性 -
function foo() { static $x = 1; }❌ 这是“静态局部变量”,和类静态属性无关
静态属性能用哪些修饰符
只能用 public、protected、private,不能和 final、abstract、readonly(PHP 8.1+)混用——readonly static 是语法错误,PHP 不支持。
-
private static $config;✅ 可以,类内可读写,子类不可见 -
protected static $cache;✅ 子类可继承并访问 -
final static $VERSION = '1.0';❌final不能修饰属性,只能修饰类或方法 -
readonly static $ID = 1;❌ PHP 当前不支持readonly static
初始化时能调用函数或 new 对象吗
PHP 7.4+ 允许在声明时用表达式初始化,但仅限「编译期可确定」的值:字面量、常量、const、??、?: 等。不能调用函数、不能 new、不能访问 $this。
-
public static $now = __CLASS__;✅ 常量表达式 -
public static $default = DEFAULT_LIMIT ?? 10;✅ 允许空合并 -
public static $list = [1,2,3];✅ 数组字面量(PHP 5.6+) -
public static $time = time();❌ 运行时函数,报Parse error -
public static $obj = new StdClass();❌ 不允许实例化
为什么改了静态属性,子类里看不到新值
因为 PHP 的静态属性不是自动“继承覆盖”的——子类如果自己也声明了同名 static 属性,就会完全屏蔽父类的,形成两个独立存储。想共享一份数据,子类就别重复声明。
立即学习“PHP免费学习笔记(深入)”;
- 父类
static $flag = true;,子类没声明同名属性 → 子类读写的是同一份 - 子类也写了
static $flag = false;→ 两者彻底隔离,互不影响 - 用
self::$flag在父类方法中访问,永远指向定义该方法的类的静态属性;想动态绑定到调用者类,得用static::$flag(后期静态绑定)
static 是不够的。









