PHP的静态属性
我有两个代码片段(关于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
我想多一个点添加到它。
STATIC变量是而不是与某个类的任何特定实例/对象相关联。因此,您可以使用父类引用或子类引用修改该变量,同一副本会被修改。
从了解公共静态作为全球分开。因此,请把它理解为没有与任何特定的实例,因此任何类层次结构引用您更新一个静态变量,相同的存储空间得到更新。
-
维诺德
中看到我对你的上一个问题的意见,以便按照你的解释,如果我改变了第一个代码的子类中var的值,像这个sub :: $ var = 3;它会更新类库中var的值? – zamil 2013-02-18 05:58:17
是的,的确如此。试试看。 – 2013-02-18 06:16:51
不,它没有: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
Public static variable
表现为global
变量。
由于public static variable
范围在于全球范围内,可以确保在任何global variable
可以改变整个program.This概念可以看出,你可以在你的示例程序分析....
感谢提示 – nut 2013-02-18 07:05:14
不客气....但是,我不会推荐使用静态变量... – 2013-02-18 08:58:04
@downvoter:照顾评论??? – 2013-11-13 03:54:00
由于sub2类不具有var2,因此需要base2类的值。因此,当您使用此sub2::$var2 = 2;
分配新值时,它将更改为新值。
在第一个代码已覆盖在你的扩展class.Both变量都有各自的类中的范围。
这是错误的,对于静态变量/方法没有超载的概念。它只是共享内存。请参阅我的评论 – 2013-02-18 05:44:28
我们绝对可以重写静态方法。但不确定静态属性,但是如果你在扩展类中声明了与父类相同的变量,它们不会指向相同的内存位置。 – zamil 2013-02-18 06:58:34
同意,请在我的回答 – 2013-02-18 07:01:59
如果传递一个静态变量来一个子类,那么这个变量是共享的(它总是在两个班的值相同)。如果你覆盖了一个子类中的静态变量,那么它的一个新的静态变量独立于来自父类的静态变量。
在片段1base::var
和sub::var
有不同的内存分配,因为你在类sub
定义$var = 2;
。
在片段2base::var
和sub::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
感谢小费,刚刚更新 – nut 2013-02-18 05:30:10
我怀疑你是混淆了'const'的结果。在php中,'static'定义了一个独立于实例的属性。但它仍然可以改变。 – datasage 2013-02-18 05:31:15
@ user1970939,你究竟想要完成什么?输出是不同的,因为你删除了'public static $ var = 2;'。但你知道。那么真正的问题是什么? – Matthew 2013-02-18 05:47:48