PHP后期静态绑定范围混乱
第二段说: 静态::介绍其范围 我相应地尝试了以下示例:PHP后期静态绑定范围混乱,php,Php,第二段说: 静态::介绍其范围 我相应地尝试了以下示例: class Father { public function test(){ echo static::$a; } } class Son extends Father{ protected static $a='static forward scope'; public function test(){ parent::test(); } } $son = ne
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
这个词?如果静态
将子
的作用域引入到父
,那么为什么私有变量对父
仍然不可见
是否有两件事
变量
范围和可见性
范围?我是PHP新手,如果这听起来很有趣,很抱歉。这里有两件事在起作用:范围和可见性。两者共同决定您是否可以访问该属性
正如您在第一次测试中发现的,后期静态绑定允许$a
在父类的范围中可用。这仅仅意味着这个类“知道”这个变量(不一定是它的值)
可见性决定特定类和实例是否可以访问范围中的变量。私有属性仅对定义它的类可见。在第二个示例中,$a
在Son
中定义为private
。无论是否有其他类知道它的存在,都无法在Son
之外访问它
static
使$a
成为父级已知的属性,但该属性的可见性决定是否可以访问其值
作为进一步帮助理解它的测试,请尝试使用self
而不是static
。您将返回另一个错误,即$a
不是父亲的属性您读过吗?尽管引入了作用域
私有
属性对任何其他类都不可见。@ponury kostek tks供参考。我读过了。但是我认为我的问题与那个线程不同。试一下这里描述的类抽象,它指的是类名解析的范围,而不是变量访问的范围。