PHP 对象继承 - 私有与受保护的父方法返回不同的结果


PHP Object Inheritance - private vs protected parent method returns different result

我可能只是对PHP的对象处理没有足够好的处理来理解这里出了什么问题,但是我有一段代码返回了我意想不到的结果,我希望这群人中的某个人可以让我了解正在发生的事情。 这是代码:

class Page
{
    public function getTitle() {
        echo $this->_title();
    }
    private function _title() {
        return "Page Title'n";
    }
}
class Title extends Page
{
    protected function _title() {
        return "Title Title'n";
    }
}
$title = new Title();
$title->getTitle();

我所期望的是getTitle将由Title类继承,并且在调用$this->getTitle()时将返回它自己的方法。 如果将父 Page 类中的 _title() 方法更改为受保护而不是私有,它将这样做。 但是,当父方法的方法是私有的时,它会被调用。

这是对象继承中的预期行为还是 PHP 的一些奇怪问题? 谁能解释一下(il?发生这种情况的逻辑?非常感谢。

这也会发生在Java和其他OO语言中。

_title() 是超类中的私有函数,因此在 OO 继承之外。 子类中的 _title() 不会覆盖同名的父函数。

您正在调用超类函数 getTitle(),因此它将首先在超类中查找 _title()。

PHP 不支持直接重载(即几个称为 getTitle() 的函数具有不同的方法签名),只能通过可选参数间接支持。

如果您将

Page::getTitle()的内容复制到Title::getTitle(),您将获得您想要的,这意味着Page::getTitle()中的$this总是首先在自身中寻找可能的匹配,并且由于这是私有的,因此不会再寻找了。

正如您提到的,您还必须声明Page::_title()受保护,以便将其覆盖。

按照 php.net 所述添加到Kevin S答案(这并不完全正确):公共和受保护的方法将被重载,私有方法不会。

在混合受保护和公共范围时要小心:

class A
{
    protected function a(){ echo "a"; }
}
class B extends A
{
    public function a(){ echo "b"; }
}

编译时不会产生错误,但尝试执行以下操作:

$b = new B;
$b->a();

,因为"a"方法将首先使用类 A 范围(每个继承)。

另一方面:

class A
{
    public function a(){ echo "a"; }
}
class B extends A
{
    protected function a(){ echo "b"; }
}

将在编译时很好地产生致命错误。

另外,PHP具有不同的方法调用模型,例如Java/C。虽然在 C 中你可以区分依赖于传递的参数的方法,但在 PHP 中,由于非显式类型定义,这是不可能的。