【发布时间】:2011-05-15 20:46:53
【问题描述】:
我最近一直在处理一些类文件,我注意到成员变量已设置为受保护的静态模式,例如受保护的静态 $_someVar,并像静态::$_someVar 一样访问。
我了解可见性的概念,并且将某些内容设置为受保护的静态将确保成员变量只能在超类或派生类中访问,但我只能在静态方法中访问受保护的静态变量吗?
谢谢
【问题讨论】:
标签: php static protected static-members
我最近一直在处理一些类文件,我注意到成员变量已设置为受保护的静态模式,例如受保护的静态 $_someVar,并像静态::$_someVar 一样访问。
我了解可见性的概念,并且将某些内容设置为受保护的静态将确保成员变量只能在超类或派生类中访问,但我只能在静态方法中访问受保护的静态变量吗?
谢谢
【问题讨论】:
标签: php static protected static-members
如果我理解正确,您所指的是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)。
当然,是的,您可以在静态方法(即:对象上下文)之外访问静态受保护成员,尽管可见性和范围仍然很重要。
【讨论】:
静态变量存在于类上,而不是类的实例上。您可以从非静态方法访问它们,调用它们如下:
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::$foo,那将返回在 A 中定义的静态 $foo。如果你将 A 子类化为 B 的一部分,那么调用继承 foo(),它会使用来自 A 的 $foo,即使你在 B 上定义它。使用 static::$foo 将使用在 B 上定义的 $foo,如果你这样做了。