我可能只是对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 中,由于非显式类型定义,这是不可能的。