14

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

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

谢谢

4

2 回答 2

45

如果我理解正确,您所指的是所谓的后期静态绑定。如果你有这个:

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

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

于 2010-11-25T21:22:13.203 回答
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 会正确地抱怨你试图访问受保护的成员。

于 2010-11-25T18:43:19.747 回答