从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的新手.
这里有两件事在起作用:范围和可见性。两者共同决定您是否可以访问该房产。
正如您在第一个测试中发现的那样,后期静态绑定可以在类的范围$a内使用。这仅仅意味着变量(不一定是它的值)对于此类来说是“已知的”。Father
可见性决定了作用域内的变量是否可以被特定的类和实例访问。私有属性仅对定义它的类可见。在您的第二个示例中,$a是private在 中定义的Son。无论任何其他类是否知道它的存在,都不能在Son.
static创建$a一个已知的属性Father,但该属性的可见性决定其值是否可以被访问。
作为进一步帮助理解它的测试,请尝试使用self代替static。您将返回一个不同的错误,该错误$a不是 的属性Father。