【问题标题】:PHP late static binding scope confusionPHP后期静态绑定范围混淆
【发布时间】:2017-06-19 12:04:52
【问题描述】:

从 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 新手,抱歉。

【问题讨论】:

标签: php


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    相关资源
    最近更新 更多