我最近一直在研究一些类文件,我注意到成员变量已经设置为受保护的静态模式,如protected static $ _someVar,并且像static :: $ _ someVar一样访问。
我理解可见性的概念,并且将某些东西设置为受保护的静态将确保成员变量只能在超类或派生类中访问,但是我是否只能在静态方法中访问受保护的静态变量?
由于
答案 0 :(得分:36)
如果我理解正确,你所指的是late-static bindings。如果你有这个:
class A {
static protected $_foo = 'bar';
static public function test() {
echo self::$_foo;
}
}
class B extends A {
static protected $_foo = 'baz';
}
B::test(); // outputs 'bar'
如果您将self
位更改为:
echo static::$_foo;
然后做:
B::test(); // outputs 'baz'
因为self
引用了定义$_foo
的类(A),而static
引用了在运行时调用它的类(B)。
当然,是的,您可以访问静态方法之外的静态受保护成员(即:对象上下文),尽管可见性和范围仍然很重要。
答案 1 :(得分: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会正确地抱怨你试图访问受保护的成员。