PHP后期静态绑定范围混乱

spa*_*ing 5 php

从PHP mannual第二段开始,它说:

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"
Run Code Online (Sandbox Code Playgroud)

它按照描述工作.但是,以下示例将引发致命错误:

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(); 
Run Code Online (Sandbox Code Playgroud)

我的主要问题是如何在scope这里解释这个词?如果static引入Son范围Father,那么为什么私有变量仍然不可见Father

有两个variable范围和visibility范围吗?如果这听起来很有趣,我是PHP的新手.

Mat*_*t S 1

这里有两件事在起作用:范围和可见性。两者共同决定您是否可以访问该房产。

正如您在第一个测试中发现的那样,后期静态绑定可以在类的范围$a内使用。这仅仅意味着变量(不一定是它的值)对于此类来说是“已知的”。Father

可见性决定了作用域内的变量是否可以被特定的类和实例访问。私有属性仅对定义它的类可见。在您的第二个示例中,$aprivate在 中定义的Son。无论任何其他类是否知道它的存在,都不能在Son.

static创建$a一个已知的属性Father,但该属性的可见性决定其值是否可以被访问。

作为进一步帮助理解它的测试,请尝试使用self代替static。您将返回一个不同的错误,该错误$a不是 的属性Father