为什么静态成员变量在PHP中实例化对象的次数时会继承该值


Why does Static member variable inherits the value when instantiatiing object number of times in PHP?

我正在测试静态关键字的确切工作原理,但我遇到了这个问题,我不明白发生了什么。

考虑两个类ClassNameA&具有以下代码的ClassNameB

没有静态关键字的ClassNameA

class ClassNameA
{
    private $name;
    public function __construct($value) {
        if($value != '') {
            $this->name = $value;
        }
        $this->getValue();
    }
    public function getValue() {
        echo $this->name;
    }
}

带有静态关键字的ClassNameB

class ClassNameB
{
    private static $name;
    public function __construct($value) {
        if($value != '') {
            self::$name = $value;
        }
        $this->getValue();
    }
    public function getValue() {
        echo self::$name;
    }
} 

当我使用ClassNameA 多次实例化对象时

$a = new ClassNameA(12);
echo '<br/>';
$a = new ClassNameA(23);
echo '<br/>';
$a = new ClassNameA(''); //Argument given is Empty here

它输出以下

12
23

现在,当我使用ClassNameB 多次实例化对象时

$a = new ClassNameB(12);
echo '<br/>';
$a = new ClassNameB(23);
echo '<br/>';
$a = new ClassNameB(''); //Argument given is Empty here

它输出以下

12
23
23

请注意,即使传递的参数为空,它也会取额外的值23。这是个虫子吗?还是我错过了什么?

这是static属性的性质。静态属性是类的一种属性,而不是对象的属性。

当您传递空白时,根据条件,静态属性的值将不会更新,最后一个值仍在静态属性中。

由于静态属性不与任何对象有界,因此它可以在不需要任何对象的情况下使用。

$a = new ClassNameB(12); //static property is set to 12
echo '<br/>';
$a = new ClassNameB(23); //static property is update to 23
echo '<br/>';
$a = new ClassNameB(''); //static property is not updated here it is still 23

编辑

你可以这样理解:-

if($value != '') {
    $this->name = $value; //
 }

上面的代码所做的是设置当前对象(当前正在初始化的对象)的属性值。

所以当你写的时候

$a = new ClassNameA(12);

它所做的是将对象aname属性设置为12

$a = new ClassNameA(23);

它所做的是将对象aname属性设置为23

但是当属性为static时,它是针对整个类的,而不是针对任何对象的。

所以当你写的时候

if($value != '') {
    self::$name = $value;
 }

上面的代码正在设置静态属性值。请注意,在这里您编写了self而不是$this,这使得它仅用于此类,而不用于任何对象。

我试着更好地解释它,但不知道它是如何为你解释的。

静态成员是整个应用程序中的单个实例,而不是每个对象一次。例如

class Example {
  static public $var;
  static public MyFunction() {
    echo "MyFunction'n";
  }
}
Example::$var = 123;
echo Example::$var;
Example::MyFunction();

请注意,我们不需要创建"Example"的实例,本质上它的名称将变量与类隔开。这将是无效的:

$example = new Example();
echo $example->var;
$example->MyFunction();

您也可以在类内将其引用为

self::$var
self::MyFunction();

这使得以后在需要时可以安全地重命名类。不过,静态函数不能访问非静态成员或方法。