PHP中的OOP可见性


OOP visibility in PHP

我最近在PHP中开始了OOP,我正在研究可见性概念(public,protected,private)。在这里,我对受保护的可见性感到困惑。受保护的成员只能在声明的类、子类或子类中访问。我在PHP的网站上有这样的例子:

class MyClass
{
    public $public = 'Public';
    protected $protected = 'Protected';
    private $private = 'Private';
    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}

class MyClass2 extends MyClass
{
    // We can redeclare the public and protected method, but not private
    protected $protected = 'Protected2';
    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
}
$obj2 = new MyClass2();
echo $obj2->public; // Works
echo $obj2->protected; // Fatal Error
echo $obj2->private; // Undefined
$obj2->printHello(); // Shows Public, Protected2, Undefined

在这段代码的最后三行(echo $obj2->protected; // Fatal Error)中,它给出了致命错误。但受保护的变量不是继承到子类中吗?在这种情况下是MyClass2吗?那么,为什么会出现这种致命错误呢?有人能告诉我这件事吗?

受保护的成员只能在声明类或子类或子类。

您必须注意中的

由于您正在从MyClass2MyClass外部访问$protected,因此会出现致命错误。

Within意味着您可以像在MyClass2::printHello()和/或MyClass::printHello()方法上那样从MyClass2访问它。