php静态属性
Posted
技术标签:
【中文标题】php静态属性【英文标题】:php static property 【发布时间】:2021-07-22 12:34:20 【问题描述】:我有两个代码 sn-ps(关于 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
【问题讨论】:
感谢提示,刚刚更新 我怀疑您将结果与const
混淆了。在 php 中static
定义了一个独立于实例的属性。但它仍然可以改变。
@user1970939,你到底想完成什么?输出不同,因为您删除了public static $var = 2;
。但你知道的。那么真正的问题是什么?
我想你在寻找:在类子使用:self::$var = 2;
【参考方案1】:
我想再补充一点。
STATIC 变量不与类的任何特定实例/对象相关联。因此,您使用父类引用或子类引用修改变量,相同的副本被修改。
因此,除了将 Public Static 理解为全局之外,请理解它与任何特定实例无关,因此对于任何类层次结构引用,您更新一个静态变量,相同的内存位置也会更新。
--
维诺德
【讨论】:
所以根据你的解释,如果我像这样 sub::$var = 3; 更改第一个代码的子类中的 var 值它会更新类库中 var 的值吗? 是的,没错。试试看。 不,它没有:class base public static $var = 1; 类子扩展基 public static $var = 2; sub::$var = 3;回声基数::$var;回声子::$var;请试试这个 @zamil 好吧,我说的是您作为问题的一部分编写的 code2 示例。如果您没有在子类中定义变量并使用子类名称(如 sub::$var)引用父类静态变量,那么 if 将更新父类的副本。如果您在每个类中都定义了相同的变量名,则它们仅更新其本地副本。我的评论仅针对您的 code2 示例【参考方案2】:Public static variable
的作用类似于 global
变量。
由于public static variable
的作用域是全球性的,你可以确保对global variable
的任何更改都可以在整个程序中看到。这个概念,你可以在你的示例程序中分析......
请查看Static variable inheritance。
【讨论】:
【参考方案3】:如果您将静态变量传递给子类,则该变量是共享的(它在两个类中始终具有相同的值)。如果你覆盖了子类中的静态变量,那么它就是一个新的静态变量,独立于父类的静态变量。
在Snippet 1中base::var
和sub::var
有不同的内存分配,因为你在sub
类中定义了$var = 2;
。
在Snippet 2中base::var
和sub::var
具有相同的内存分配,因为您没有在sub2
类中指定$var2
。
这就是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
【讨论】:
【参考方案4】:由于 sub2 类没有 var2,它采用 base2 类的值。因此,当您使用此 sub2::$var2 = 2;
分配新值时,它更改为新值。
在第一个代码中,您在扩展类中覆盖了它。两个变量在各自的类中都有范围。
【讨论】:
错了,静态变量/方法没有override的概念。它只是相同的共享内存。请参考我的评论 我们绝对可以重写静态方法。但不确定静态属性,但如果你在扩展类中声明与父类相同的变量,它们不会指向相同的内存位置。 同意,请在我的回答中查看我对您上一个问题的回答以上是关于php静态属性的主要内容,如果未能解决你的问题,请参考以下文章