受保护的静态成员变量

Posted

技术标签:

【中文标题】受保护的静态成员变量【英文标题】:Protected static member variables 【发布时间】:2011-05-15 20:46:53 【问题描述】:

我最近一直在处理一些类文件,我注意到成员变量已设置为受保护的静态模式,例如受保护的静态 $_someVar,并像静态::$_someVar 一样访问。

我了解可见性的概念,并且将某些内容设置为受保护的静态将确保成员变量只能在超类或派生类中访问,但我只能在静态方法中访问受保护的静态变量吗?

谢谢

【问题讨论】:

【参考方案1】:

如果我理解正确,您所指的是late-static bindings。如果你有这个:

class A 
   protected static $_foo = 'bar';

   protected static function test() 
      echo self::$_foo;
   


class B extends A 
   protected static $_foo = 'baz';


B::test(); // outputs 'bar'

如果您将self 位更改为:

echo static::$_foo;

然后做:

B::test(); // outputs 'baz'

因为self 引用了定义$_foo 的类(A),而static 引用了在运行时调用它的类(B)。

当然,是的,您可以在静态方法(即:对象上下文)之外访问静态受保护成员,尽管可见性和范围仍然很重要。

【讨论】:

我认为在这个例子中B类应该是“B类扩展A”。 @Nathan:很好的电话(甚至几周后)。固定的。谢谢!【参考方案2】:

静态变量存在于类上,而不是类的实例上。您可以从非静态方法访问它们,调用它们如下:

self::$_someVar

之所以如此,是因为self 是对当前类的引用,而不是对当前实例的引用(如$this)。

通过演示的方式:

<?
class A 
  protected static $foo = "bar";

  public function bar() 
    echo self::$foo;
  


class B extends A  

$a = new A();
$a->bar();

$b = new B();
$b->bar();
?>

输出为barbar。但是,如果您尝试直接访问它:

echo A::$foo;

那么 php 会正确地抱怨你试图访问受保护的成员。

【讨论】:

好吧,为什么要使用 self 而不是 static?例如。 self::$foo 或 static::$foo 哦,是的,在课堂外尝试时,但我说的是在类方法中访问它时。 如果你定义了 A->foo(),并且它调用了self::$foo,那将返回在 A 中定义的静态 $foo。如果你将 A 子类化为 B 的一部分,那么调用继承 foo(),它会使用来自 A 的 $foo,即使你在 B 上定义它。使用 static::$foo 将使用在 B 上定义的 $foo,如果你这样做了。

以上是关于受保护的静态成员变量的主要内容,如果未能解决你的问题,请参考以下文章

通过基类变量访问的 C# 受保护成员 [重复]

子类真的继承私有成员变量吗?

Symfony 2,未定义的变量,在构造函数中初始化为 ArrayCollection 的受保护成员通过错误,它是未定义的

静态成员函数无法访问类的受保护成员

为啥我会得到带有受保护静态成员的 C2248(不可访问成员)?

第25课 类的静态成员变量