受保护的静态成员变量

问题描述 投票:13回答:2

我最近在处理一些类文件,我发现成员变量被设置为protected static $_someVar这样的保护静态模式,并且像static::$_someVar这样访问。

我理解可见性的概念,将某物设置为protected static可以确保成员变量只能在超级类或派生类中被访问,但我是否只能在静态方法中访问protected static变量?

请教

php static protected static-members
2个回答
39
投票

如果我没有理解错的话,你所说的是所谓的 "保护静态变量"。迟来的静电吸附. 如果你有这个。

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)。

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


7
投票

静态变量存在于类上,而不是类的实例上。你可以从非静态方法中访问它们,调用它们,就像这样。

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就会抱怨你试图访问一个受保护的成员。

© www.soinside.com 2019 - 2024. All rights reserved.