php静态属性

时间:2013-02-18 05:27:40

标签: php class static

我有两个代码段(关于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

4 个答案:

答案 0 :(得分:15)

我想补充一点。

STATIC变量与类的任何特定实例/对象相关联。因此,您使用父类引用或子类引用修改变量,同一副本将被修改。

因此,除了将Public Static理解为Global之外,请理解它与任何特定实例无关,因此在更新静态变量的任何类层次结构引用中,相同的内存位置都会更新。

-

维诺德

答案 1 :(得分:7)

Public static variable的行为类似global变量。

由于public static variable的范围在全球范围内,您可以确保在整个程序中可以看到global variable的任何更改。这个概念,您可以在示例程序中进行分析.... / p>

请查看Static variable inheritance

答案 2 :(得分:0)

由于sub2类没有var2,因此它取base2 class的值。所以当你使用这个sub2::$var2 = 2;分配一个新值时,它改为新值。

在第一个代码中,您在扩展类中重写了它。两个变量的范围都在各自的类中。

答案 3 :(得分:0)

如果将静态变量传递给子类,则此变量是共享的(它在两个类中始终具有相同的值)。如果覆盖子类中的静态变量,那么它是一个新的静态变量,独立于父变量的静态变量。

代码段1 base::varsub::var中有不同的内存分配,因为您在课程$var = 2;中定义了sub

代码段2 base::varsub::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