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供参考。我读过了。但是我认为我的问题与那个线程不同。试一下这里描述的类抽象,它指的是类名解析的范围,而不是变量访问的范围。