PHP后期静态绑定范围混淆
从PHP的第二段,它说:
static ::引入其范围。
我相应地尝试了下面的例子:
class Father {
public function test(){
echo static::$a;
}
}
class Son extends Father{
protected static $a='static forward scope';
public function test(){
parent::test();
}
}
$son = new Son();
$son->test(); // print "static forward scope"
它按照所述的方式工作 但是,以下示例会引发一个致命错误:
class Father {
public function test(){
echo static::$a;
}
}
class Son extends Father{
private static $a='static forward scope';
public function test(){
parent::test();
}
}
// print "Fatal erro: Cannot access private property Son::$a"
$son = new Son();
$son->test();
我的主要问题是如何在这里解释单词scope
? 如果static
向Father
介绍Son
的范围,那么为什么私人变量对Father
依然隐形?
variable
范围和visibility
范围有两件事吗? 如果这听起来很有趣,我对PHP很抱歉。
这里有两件事情:范围和可见性。 两者一起决定您是否可以访问该房产。
正如你在第一次测试中发现的那样,迟到的静态绑定让$a
在Father
类的范围内可用。 这仅仅意味着变量(不一定是它的值)对于这个类是“已知的”。
可见性决定范围内的变量是否可以被特定的类和实例访问。 私人财产仅对定义它的类可见。 在第二个例子中, $a
在Son
被定义为private
。 无论其他班是否知道它存在,它都不能在Son
以外被访问。
static
使得$a
一个Father
知道的属性,但属性的可见性决定了它的值是否可以被访问。
作为进一步帮助理解它的测试,请尝试使用self
而不是static
。 你会得到一个不同的错误,即$a
不是Father
一个属性。
上一篇: PHP late static binding scope confusion
下一篇: self:: referring to derived class in static methods of a parent class