繁体   English   中英

php静态属性

[英]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::varsub::var有不同的内存分配,因为你定义了$var = 2; 在类sub

Snippet 2 中base::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

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

在第一个代码中,您在扩展类中覆盖了它。两个变量在它们各自的类中都有作用域。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM