具有以下类层次结构:
class TheParent{
public function parse(){
$this->validate();
}
}
class TheChild extends TheParent{
private function validate(){
echo 'Valid!!';
}
}
$child= new TheChild();
$child->parse();
实现此操作的步骤顺序是什么?
问题是当我运行该代码时出现以下错误:
Fatal error: Call to private method TheChild::validate() from context 'TheParent' on line 4
由于 TheChild
继承自 TheParent
,因此在 parse()
中调用的 $this
不应该引用$child
的实例,因此 validate()
对 parse()
可见?
注意:
经过一些研究后,我发现这个问题的解决方案要么根据 this comment 使 validate()
函数 protected
在 PHP 手册中,尽管我不完全理解为什么它在这种情况下起作用。
第二个解决方案是在父级中创建一个abstract protected
方法validate()
,并在子级中将其重写(这将是多余的)到第一个解决方案,如下所示子级的 protected 方法可以从父级访问吗?!!
有人可以解释一下在这种情况下继承是如何工作的吗?
最佳答案
其他发帖者已经指出,需要保护这些方法才能访问它们。
我认为您应该在代码中再更改一件事。您的基类 parent
依赖于子类中定义的方法。那是糟糕的编程。像这样更改您的代码:
abstract class TheParent{
public function parse(){
$this->validate();
}
abstract function validate();
}
class TheChild extends TheParent{
protected function validate(){
echo 'Valid!!';
}
}
$child= new TheChild();
$child->parse();
创建抽象函数可确保子类一定具有函数validate
,因为抽象类的所有抽象函数都必须实现从这样的类继承
关于php - 在 PHP 中从父类调用子方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12934744/