我有两个代码段(关于static
关键字),我希望它们具有相同的输出,但实际上输出是不同的。
问题是为什么?
Snippet 1
class base
{
public static $var = 1;
}
class sub extends base
{
public static $var = 2;
}
echo base::$var; // Outputs 1
1
Snippet 2
class base2
{
public static $var2 = 1;
}
class sub2 extends base2
{
}
sub2::$var2 = 2;
echo base2::$var2; // Outputs 2
2
答案 0 :(得分:15)
我想补充一点。
STATIC变量不与类的任何特定实例/对象相关联。因此,您使用父类引用或子类引用修改变量,同一副本将被修改。
因此,除了将Public Static理解为Global之外,请理解它与任何特定实例无关,因此在更新静态变量的任何类层次结构引用中,相同的内存位置都会更新。
-
维诺德
答案 1 :(得分:7)
Public static variable
的行为类似global
变量。
由于public static variable
的范围在全球范围内,您可以确保在整个程序中可以看到global variable
的任何更改。这个概念,您可以在示例程序中进行分析.... / p>
答案 2 :(得分:0)
由于sub2类没有var2,因此它取base2 class的值。所以当你使用这个sub2::$var2 = 2;
分配一个新值时,它改为新值。
在第一个代码中,您在扩展类中重写了它。两个变量的范围都在各自的类中。
答案 3 :(得分:0)
如果将静态变量传递给子类,则此变量是共享的(它在两个类中始终具有相同的值)。如果覆盖子类中的静态变量,那么它是一个新的静态变量,独立于父变量的静态变量。
在代码段1 base::var
和sub::var
中有不同的内存分配,因为您在课程$var = 2;
中定义了sub
。
在代码段2 base::var
和sub::var
具有相同的内存分配,因为您未在类$var2
中指定sub2
。< / p>
这就是为什么base:var
没有改变。如果您稍后从$var
课程更改sub
,也不会更改:
class base
{
public static $var = 1;
}
class sub extends base
{
public static $var = 2;
}
sub::var = 3
echo base::var; // Outputs 1