14

我有两个代码片段(关于static关键字),我希望它们具有相同的输出,但实际上输出是不同的。

问题是为什么?

片段 1

class base
{
    public static $var = 1;
}

class sub extends base
{
    public static $var = 2;
}

echo base::$var; // Outputs 1

1

片段 2

class base2
{
    public static $var2 = 1;
}

class sub2 extends base2
{
}

sub2::$var2 = 2;
echo base2::$var2; // Outputs 2

2

4

4 回答 4

21

我想再补充一点。

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

因此,除了将 Public Static 理解为 Global 之外,请将其理解为与任何特定实例无关,因此对于任何类层次结构引用,您都可以更新静态变量,相同的内存位置也会得到更新。

--

维诺德

于 2013-02-18T05:43:04.027 回答
8

Public static variable就像global变量一样。

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

请查看静态变量继承

于 2013-02-18T05:32:12.543 回答
2

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

Snippet 1 base::var中并sub::var具有不同的内存分配,因为您$var = 2;在类中定义了sub.

Snippet 2 base::var中并sub::var具有相同的内存分配,因为您没有$var2在类中指定sub2

这就是为什么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
于 2017-10-14T07:56:27.463 回答
0

由于 sub2 类没有 var2 它采用 base2 类的值。因此,当您使用它分配新值时,sub2::$var2 = 2;它会更改为新值。

在第一个代码中,您已经在扩展类中覆盖了它。两个变量在它们各自的类中都有范围。

于 2013-02-18T05:40:59.923 回答