[英]php static property
我有两个代码片段(关于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
我想再补充一点。
静态变量不相关联的一类的任何特定实例/对象。 因此,您使用父类引用或子类引用修改变量,相同的副本被修改。
因此,除了将公共静态理解为全局之外,请将其理解为与任何特定实例无关,因此对于任何类层次结构引用,您更新静态变量,相同的内存位置都会更新。
——
维诺德
Public static variable
作用类似于global
变量。
由于public static variable
的作用域是全局的,你可以保证global variable
任何变化都可以在整个程序中看到。这个概念,你可以在你的示例程序中分析......
请查看静态变量继承。
如果将静态变量传递给子类,则该变量是共享的(它在两个类中始终具有相同的值)。 如果覆盖子类中的静态变量,则它是一个独立于父类静态变量的新静态变量。
在Snippet 1 base::var
和sub::var
有不同的内存分配,因为你定义了$var = 2;
在类sub
。
在Snippet 2 中base::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
由于 sub2 类没有 var2,它采用 base2 类的值。因此,当您使用sub2::$var2 = 2;
分配新值时sub2::$var2 = 2;
它更改为新值。
在第一个代码中,您在扩展类中覆盖了它。两个变量在它们各自的类中都有作用域。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.