PHP类静态属性值被覆盖问题求助:为何实例值变更?
问题解答:PHP静态属性被覆盖的原因
这事儿核心原因就是静态属性属于类本身,而非类的实例,咱们一步步拆解你的代码逻辑就懂了:
代码执行的完整流程
- 第一行
$c1 = new a;:创建第一个实例$c1时,类的构造函数__construct()触发,给静态属性self::$b赋值了随机数4468,所以第一个echo $c1->get_bb()输出4468。 - 调用
$c1->get_c():这个方法内部又执行了$vv= new a();——创建第二个实例$vv时,构造函数再次触发,直接覆盖了类的静态属性self::$b的值,变成了新的随机数6007。随后调用$vv->get_bb()返回的就是这个新值,所以第二个输出是6007。 - 最后一行
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,提问作者Павел Сайчик
相关产品推荐
相关产品推荐

