PHP中的继承和类作用域

dzhpxtsq  于 2022-12-28  发布在  PHP
关注(0)|答案(1)|浏览(94)

我尝试学习继承在PHP中。一个问题,我不能得到它。我有一个块代码如下:

class BaseClass {
    private $name = "BaseClass";
    public function getName() {
        echo $this->name;
    }
}

class ChildClass extends BaseClass {
    private $name = "ChildClass";
}

$ob = new ChildClass;
echo $ob->getName(); //result: "BaseClass" . I think its result is "ChildClass".

但是,将**$name的可见性更改为public**时,结果不同。

class BaseClass {
    public $name = "BaseClass";
    public function getName() {
        echo $this->name;
    }
}

class ChildClass extends BaseClass {
    public $name = "ChildClass";
}

$ob = new ChildClass;
echo $ob->getName(); // Result: "ChildClass".

请帮我解释一下这个问题。谢谢!

lhcgjxsq

lhcgjxsq1#

我想,这样做的原因是私有属性没有被覆盖,而是形成了两个属性。如果你把private改为protected,它就会工作。
当你调用getName()方法时,你的作用域是父方法的作用域,因为它不存在于子方法中。在你的例子中,private $name存在两次。并且由于作用域,你将得到parent属性的值($this将尝试从同一个作用域调用私有方法)。
如果你运行var_dump($ob),你就会明白我的意思:

object(ChildClass)#1 (2) {
  ["name":"BaseClass":private]=>
  string(9) "BaseClass"
  ["name":"ChildClass":private]=>
  string(10) "ChildClass"
}

如果您覆盖了子类中的父方法,则当您更改范围时,结果也将起作用。
希望能有所帮助。

相关问题