PHP静态属性如何声明_PHP静态属性声明语法【语法】

5次阅读

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

PHP静态属性如何声明_PHP静态属性声明语法【语法】

PHP静态属性怎么写才合法

必须用 static 关键字修饰,且只能在类内部声明,不能在方法里或全局作用域写。漏掉 static 或错放在函数内,会直接报 Parse Error: syntax error

  • public static $count = 0; ✅ 合法,访问修饰符 + static + 变量名
  • static $count = 0; ✅ 合法(默认 public,但不推荐省略)
  • public $count = 0; ❌ 不是静态属性,只是普通属性
  • function foo() { static $x = 1; } ❌ 这是“静态局部变量”,和类静态属性无关

静态属性能用哪些修饰符

只能用 publicprotectedprivate,不能和 finalabstractreadonly(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 是不够的。

text=ZqhQzanResources