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 混淆了。在 phpstatic 定义了一个独立于实例的属性。但它仍然可以改变。 @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 1base::varsub::var有不同的内存分配,因为你在sub类中定义了$var = 2;

Snippet 2base::varsub::var具有相同的内存分配,因为您没有在sub2类中指定$var2

这就是base:var 没有改变的原因。如果您稍后将 $varsub 类更改为这样,它也不会改变:

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静态属性的主要内容,如果未能解决你的问题,请参考以下文章

php中静态方法和静态属性的介绍

php静态属性和静态方法学习笔记

php中常量 const属性,静态属性,静态的函数方法

php中常量 const属性,静态属性,静态的函数方法

php静态方法

php 静态属性和静态变量