You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP类静态属性值被覆盖问题求助:为何实例值变更?

问题解答:PHP静态属性被覆盖的原因

这事儿核心原因就是静态属性属于类本身,而非类的实例,咱们一步步拆解你的代码逻辑就懂了:

代码执行的完整流程

  1. 第一行$c1 = new a;:创建第一个实例$c1时,类的构造函数__construct()触发,给静态属性self::$b赋值了随机数4468,所以第一个echo $c1->get_bb()输出4468。
  2. 调用$c1->get_c():这个方法内部又执行了$vv= new a();——创建第二个实例$vv时,构造函数再次触发,直接覆盖了类的静态属性self::$b的值,变成了新的随机数6007。随后调用$vv->get_bb()返回的就是这个新值,所以第二个输出是6007。
  3. 最后一行echo $c1->get_bb():因为get_bb()返回的是类的静态属性self::$b,而这个属性已经被第二个实例的构造函数改成6007了,所以输出的是6007,而非最初的4468。

关键知识点:PHP静态属性的特性

静态属性是类级别的共享变量,所有该类的实例都会共用这同一个属性值:

  • 不管你创建多少个实例,它们访问的都是同一个静态属性;
  • 任何一个实例(或者直接通过类名)修改了静态属性,所有实例后续访问到的都是修改后的值。

验证修改建议

如果想让每个实例拥有独立的属性值,只需要把private static $b改成非静态的private $b,同时把构造函数和get_bb()里的self::$b改成$this->b,这样每个实例的$b都是独立的,最后一行输出就会是最初的4468了。

内容的提问来源于stack exchange,提问作者Павел Сайчик

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:19:34