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 ? 如果staticFather介绍Son的范围,那么为什么私人变量对Father依然隐形?

variable范围和visibility范围有两件事吗? 如果这听起来很有趣,我对PHP很抱歉。


这里有两件事情:范围和可见性。 两者一起决定您是否可以访问该房产。

正如你在第一次测试中发现的那样,迟到的静态绑定让$aFather类的范围内可用。 这仅仅意味着变量(不一定是它的值)对于这个类是“已知的”。

可见性决定范围内的变量是否可以被特定的类和实例访问。 私人财产仅对定义它的类可见。 在第二个例子中, $aSon被定义为private 。 无论其他班是否知道它存在,它都不能在Son以外被访问。

static使得$a一个Father知道的属性,但属性的可见性决定了它的值是否可以被访问。

作为进一步帮助理解它的测试,请尝试使用self而不是static 。 你会得到一个不同的错误,即$a不是Father一个属性。

链接地址: http://www.djcxy.com/p/58043.html

上一篇: PHP late static binding scope confusion

下一篇: self:: referring to derived class in static methods of a parent class