我最近在处理一些类文件,我发现成员变量被设置为protected static $_someVar这样的保护静态模式,并且像static::$_someVar这样访问。
我理解可见性的概念,将某物设置为protected static可以确保成员变量只能在超级类或派生类中被访问,但我是否只能在静态方法中访问protected static变量?
请教
如果我没有理解错的话,你所说的是所谓的 "保护静态变量"。迟来的静电吸附. 如果你有这个。
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)。
当然,是的,你可以在静态方法之外访问静态保护成员(即:对象上下文),尽管可见性和范围仍然很重要。
静态变量存在于类上,而不是类的实例上。你可以从非静态方法中访问它们,调用它们,就像这样。
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就会抱怨你试图访问一个受保护的成员。