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

为什么静态成员变量在PHP中多次实例化对象时会继承该值?,php,oop,static,Php,Oop,Static,我在测试Static关键字,看它到底是如何工作的,我遇到了这个问题,我不知道发生了什么 考虑使用以下代码的两个类ClassNameA和ClassNameB ClassNameA不带静态关键字 class ClassNameA { private $name; public function __construct($value) { if($value != '') { $this->name = $value; }

我在测试Static关键字,看它到底是如何工作的,我遇到了这个问题,我不知道发生了什么

考虑使用以下代码的两个类
ClassNameA
ClassNameB

ClassNameA不带静态关键字

class ClassNameA
{
    private $name;

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

    public function __construct($value) {
        if($value != '') {
            self::$name = $value;
        }
        $this->getValue();
    }
    public function getValue() {
        echo self::$name;
    }
} 
带有静态关键字的ClassNameB

class ClassNameA
{
    private $name;

    public function __construct($value) {
        if($value != '') {
            $this->name = $value;
        }
        $this->getValue();
    }
    public function getValue() {
        echo $this->name;
    }
}
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
现在,当我使用ClassNameB多次实例化对象时

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

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

这是
静态属性的本质。静态属性是类的属性而不是对象的属性

当您通过空白时,根据该条件,静态属性的值将不被更新,最后的值仍然存在于静态属性中。

由于静态属性不与任何对象绑定,因此它不需要任何对象即可使用

$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
上面的代码所做的是为当前对象(正在初始化的对象)设置属性值

所以当你写信的时候

$a = new ClassNameA(12);
它所做的是将对象
a
name
属性设置为
12

$a = new ClassNameA(23);
它所做的是将对象
a
name
属性设置为
23

$a = new ClassNameA(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 != '') {
    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();

这样以后如果需要,可以安全地重命名该类。静态函数不能访问非静态成员或方法。

好的,你的意思是,一旦我声明它并启动对象,或者如果它已加载到内存中,它将变为全局函数,我可以在任何地方访问它?它是全局函数,可以在任何地方访问,只要它的作用域是公共的。你也可以使用静态方法。哦,这是否意味着静态变量的作用域是全局的?谢谢你这么好的解释。我确实明白你想说什么。:)