2013-02-18 76 views
6

我有两个代码片段(关于static关键字),我希望他们有相同的输出,但实际上输出是不同的。PHP的静态属性

问题是为什么?

片段1

class base 
{ 
    public static $var = 1; 
} 

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

echo base::$var; // Outputs 1 

片段2

class base2 
{ 
    public static $var2 = 1; 
} 

class sub2 extends base2 
{ 
} 

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

感谢小费,刚刚更新 – nut 2013-02-18 05:30:10

+0

我怀疑你是混淆了'const'的结果。在php中,'static'定义了一个独立于实例的属性。但它仍然可以改变。 – datasage 2013-02-18 05:31:15

+0

@ user1970939,你究竟想要完成什么?输出是不同的,因为你删除了'public static $ var = 2;'。但你知道。那么真正的问题是什么? – Matthew 2013-02-18 05:47:48

回答

11

我想多一个点添加到它。

STATIC变量是而不是与某个类的任何特定实例/对象相关联。因此,您可以使用父类引用或子类引用修改该变量,同一副本会被修改。

从了解公共静态作为全球分开。因此,请把它理解为没有与任何特定的实例,因此任何类层次结构引用您更新一个静态变量,相同的存储空间得到更新。

-

维诺德

+0

中看到我对你的上一个问题的意见,以便按照你的解释,如果我改变了第一个代码的子类中var的值,像这个sub :: $ var = 3;它会更新类库中var的值? – zamil 2013-02-18 05:58:17

+0

是的,的确如此。试试看。 – 2013-02-18 06:16:51

+0

不,它没有:class base { public static $ var = 1; } class sub extends base { public static $ var = 2; } sub :: $ var = 3; echo base :: $ var; echo sub :: $ var;请试试这个 – zamil 2013-02-18 06:23:17

7

Public static variable表现为global变量。

由于public static variable范围在于全球范围内,可以确保在任何global variable可以改变整个program.This概念可以看出,你可以在你的示例程序分析....

请在看Static variable inheritance

+0

感谢提示 – nut 2013-02-18 07:05:14

+0

不客气....但是,我不会推荐使用静态变量... – 2013-02-18 08:58:04

+1

@downvoter:照顾评论??? – 2013-11-13 03:54:00

0

由于sub2类不具有var2,因此需要base2类的值。因此,当您使用此sub2::$var2 = 2;分配新值时,它将更改为新值。

在第一个代码已覆盖在你的扩展class.Both变量都有各自的类中的范围。

+0

这是错误的,对于静态变量/方法没有超载的概念。它只是共享内存。请参阅我的评论 – 2013-02-18 05:44:28

+0

我们绝对可以重写静态方法。但不确定静态属性,但是如果你在扩展类中声明了与父类相同的变量,它们不会指向相同的内存位置。 – zamil 2013-02-18 06:58:34

+0

同意,请在我的回答 – 2013-02-18 07:01:59

0

如果传递一个静态变量来一个子类,那么这个变量是共享的(它总是在两个班的值相同)。如果你覆盖了一个子类中的静态变量,那么它的一个新的静态变量独立于来自父类的静态变量。

片段1base::varsub::var有不同的内存分配,因为你在类sub定义$var = 2;

片段2base::varsub::var具有相同的内存分配,因为你没有在课堂上sub2指定$var2

那就是为什么base:var没有变化。这也不会,如果你从sub级以后像这样的改变$var改变:

class base 
{ 
    public static $var = 1; 
} 

class sub extends base 
{ 
    public static $var = 2; 
} 
sub::var = 3 
echo base::var; // Outputs 1