技巧归纳 | 3分钟
如何修改 类名::静态变量 ?
十一月 12, 2021
PHP 技巧

好久没更新了,其中经历了备战省赛,重装电脑,换服务器,重新搭建博客等一系列事,受到许多技术大牛的指点,而且新人太厉害了,卷卷卷!

Geek Challenge 2021有一道BabyPOP,这个题其实不难的,但我知识点掌握太少了,题刷的还是少。类名::静态变量 这种调用方式遇到过,但只是利用它,而没想过改变它。

如何改变类名::静态变量?

我们先来做几个测试

1.无操作

php
 1<?php
 2class A{
 3	public  static $x=false;
 4	public function test(){
 5        var_dump(A::$x);
 6        var_dump($this->x);
 7	}
 8}
 9$s=new A();
10$s->test();

此时A::$x为false,$this->x为NULL

2.使用construct方法改变$this->x值

php
 1<?php
 2class A{
 3	public  static $x=false;
 4    public function __construct(){
 5        $this->x=true;
 6    }
 7	public function test(){
 8        var_dump(A::$x);
 9        var_dump($this->x);
10	}
11}
12$s=new A();
13$s->test();

此时A::$x为false,$this->x为true,可见使用construct方法只能改变$this->x,对A::$x无效

3.反序列化改变$this->x的值

先生成一个序列化字符串

php
1<?php
2class A{
3	public  static $x=false;
4    public function __construct(){
5        $this->x=true;
6    }
7}
8echo serialize(new A());

序列化字符串:O:1:"A":1:{s:1:"x";b:1;}

传入字符串

php
 1<?php
 2class A{
 3	public  static $x=false;
 4	public function test(){
 5        var_dump(A::$x);
 6        var_dump($this->x);
 7	}
 8}
 9$s=unserialize('O:1:"A":1:{s:1:"x";b:1;}');
10$s->test();

此时A::$x为false,$this->x为true,可见使用反序列化方法只能改变$this->x,对A::$x无效

4.在其他类中改变A::$x的值

php
 1<?php
 2class A{
 3	public  static $x=false;
 4	public function test(){
 5        var_dump(A::$x);
 6        var_dump($this->x);
 7	}
 8}
 9
10class B{
11    public function __construct(){
12        A::$x=true;
13        $p=new A();
14        $p->test();
15    }
16}
17$s=new B();

此时A::$x为true,$this->x因为没赋值所以为NULL若是想修改,参考测试2在A类里可以直接改

此时我们找到了修改 类名::静态变量 的方法,其实也不难想到,$this->x就是在类内引用,所以在类内改;而A::$x在类外引用,自然在类外修改更为合理。