为什么静态成员变量在PHP中多次实例化对象时会继承该值?
我在测试Static关键字,看它到底是如何工作的,我遇到了这个问题,我不知道发生了什么 考虑使用以下代码的两个类为什么静态成员变量在PHP中多次实例化对象时会继承该值?,php,oop,static,Php,Oop,Static,我在测试Static关键字,看它到底是如何工作的,我遇到了这个问题,我不知道发生了什么 考虑使用以下代码的两个类ClassNameA和ClassNameB ClassNameA不带静态关键字 class ClassNameA { private $name; public function __construct($value) { if($value != '') { $this->name = $value; }
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();
这样以后如果需要,可以安全地重命名该类。静态函数不能访问非静态成员或方法。好的,你的意思是,一旦我声明它并启动对象,或者如果它已加载到内存中,它将变为全局函数,我可以在任何地方访问它?它是全局函数,可以在任何地方访问,只要它的作用域是公共的。你也可以使用静态方法。哦,这是否意味着静态变量的作用域是全局的?谢谢你这么好的解释。我确实明白你想说什么。:)