PHP后期静态绑定范围混乱

时间:2017-06-19 12:04:53

标签: 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"

它的工作原理如上所述。但是,以下示例将引发致命错误:

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这个词?如果staticSon的范围引入Father,那么为什么私有变量对Father仍然不可见?

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

1 个答案:

答案 0 :(得分:1)

这里有两件事:范围和可见性。两者一起决定您是否可以进入酒店。

正如您在第一次测试中发现的那样,后期静态绑定允许$a类的范围中提供Father。这仅仅意味着变量(不一定是它的价值)是已知的"到这堂课。

可见性决定特定类和实例是否可以访问范围中的变量。私有属性仅对定义它的类可见。在第二个示例中,$aprivate内定义为Son。无论其他类是否知道它存在,都无法在Son之外访问。

static使$a成为Father已知的属性,但该属性的可见性决定了是否可以访问其值。

作为进一步帮助理解它的测试,请尝试使用self代替static。您将收到$a不属于Father属性的其他错误。