我正在测试静态关键字的确切工作原理,但我遇到了这个问题,我不明白发生了什么。
考虑两个类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);
它所做的是将对象a
的name
属性设置为12
;
$a = new ClassNameA(23);
它所做的是将对象a
的name
属性设置为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();
这使得以后在需要时可以安全地重命名类。不过,静态函数不能访问非静态成员或方法。