12 php static protected static-members
我最近一直在研究一些类文件,我注意到成员变量已经设置为受保护的静态模式,如protected static $ _someVar,并且像static :: $ _ someVar一样访问.
我理解可见性的概念,并且将某些东西设置为受保护的静态将确保成员变量只能在超类或派生类中访问,但是我是否只能在静态方法中访问受保护的静态变量?
谢谢
net*_*der 38
如果我理解正确,你所指的是称为后期静态绑定.如果你有这个:
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'
Run Code Online (Sandbox Code Playgroud)
如果您将self位更改为:
echo static::$_foo;
Run Code Online (Sandbox Code Playgroud)
然后做:
B::test(); // outputs 'baz'
Run Code Online (Sandbox Code Playgroud)
因为self引用了$_foo定义的类(A),同时static引用了在运行时调用它的类(B).
当然,是的,你可以在静态方法(即:对象上下文)之外访问静态受保护的成员,尽管可见性和范围仍然很重要.
静态变量存在于类中,而不是存在于类的实例上.您可以从非静态方法访问它们,调用它们:
self::$_someVar
Run Code Online (Sandbox Code Playgroud)
这有效的原因是它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();
?>
Run Code Online (Sandbox Code Playgroud)
输出是barbar.但是,如果您尝试直接访问它:
echo A::$foo;
Run Code Online (Sandbox Code Playgroud)
然后,PHP会正确地抱怨您尝试访问受保护的成员.
| 归档时间: |
|
| 查看次数: |
27072 次 |
| 最近记录: |