静态属性属于类而非实例,必须用类名::$prop或self::/$static::访问,禁用$this;其值全局共享且跨请求持久,继承中static支持后期绑定而self不支持,不可序列化。

静态属性只能用类名或 self/static 访问,不能用 $this
PHP 中静态属性属于类本身,而非某个实例,所以 $this->staticProp 是非法的,运行时会报 Fatal error: Uncaught Error: Using $this when not in object context 或静默失败(取决于 PHP 版本和严格模式)。必须显式通过作用域限定符访问。
- 在类外部:用
ClassName::$propName(注意是两个冒号) - 在类内部方法中:推荐用
self::$propName(绑定定义时的类)或static::$propName(支持后期静态绑定,适合继承场景) - 绝对不要写
$this->$propName或$this->propName—— 即使属性声明为static也不行
修改静态属性值要小心作用域和初始化时机
静态属性在类首次加载时初始化一次,后续所有读写都共享同一份内存。修改它会影响所有后续调用,包括其他实例、子类(除非被重写),甚至 CLI 请求间若用 OPcache + 持久化 SAPI(如 PHP-FPM 的 worker 复用),还可能跨请求残留。
- 赋值直接用
ClassName::$count = 10;或类内self::$count = 10; - 避免在构造函数里反复重置静态计数器,除非你明确需要每次 new 都重置 —— 那说明它不该是 static
- 如果依赖运行时配置(如从 config.php 读取初始值),确保该文件在类定义前已加载,否则
static $x = Config::get('default');会因常量表达式限制而报错
static 和 self 在继承中行为不同,选错会导致逻辑错误
这是最容易踩坑的地方:用 self 会始终指向定义该代码的类,而 static 指向实际调用时的类(后期静态绑定,LSB)。比如子类覆写了同名静态属性,self::$val 读不到子类值,但 static::$val 可以。
采用 php+mysql 数据库方式运行的强大网上商店系统,执行效率高速度快,支持多语言,模板和代码分离,轻松创建属于自己的个性化用户界面 v3.5更新: 1).进一步静态化了活动商品. 2).提供了一些重要UFT-8转换文件 3).修复了除了网银在线支付其它支付显示错误的问题. 4).修改了LOGO广告管理,增加LOGO链接后主页LOGO路径错误的问题 5).修改了公告无法发布的问题,可能是打压
class A {
public static $name = 'A';
public static function getName() {
return self::$name; // 总是 'A'
// return static::$name; // 子类调用时返回子类的 $name
}
}
class B extends A {
public static $name = 'B';
}
echo B::getName(); // 输出 'A'(用 self),不是 'B'
- 想让子类“覆盖”静态属性并生效 → 用
static::$prop - 想强制锁定到当前类定义的行为(比如工具类内部状态)→ 用
self::$prop - PHP 5.3+ 支持 LSB,但低于此版本不识别
static::,需降级兼容时统一用self
静态属性无法序列化进对象,var_dump 显示但 json_encode 会丢弃
这是调试时常见困惑:var_dump($obj) 能看到静态属性,但 json_encode($obj) 或 serialize($obj) 完全不包含它们 —— 因为静态属性不属于对象状态,而是类状态。
立即学习“PHP免费学习笔记(深入)”;
- 别指望
json_encode()输出静态属性值;如需导出,得手动拼数组:['static_count' => MyClass::$count] -
clone对象不会复制静态属性,也不会触发其重新初始化 - 使用
__sleep()时,返回的属性名列表里写静态属性名无效,会被忽略









