Son*_*ngo 2 php oop inheritance visibility
具有以下类层次结构:
class TheParent{
public function parse(){
$this->validate();
}
}
class TheChild extends TheParent{
private function validate(){
echo 'Valid!!';
}
}
$child= new TheChild();
$child->parse();
Run Code Online (Sandbox Code Playgroud)
这个步骤的顺序是什么?
问题是,当我运行该代码时,它给出了以下错误:
Fatal error: Call to private method TheChild::validate() from context 'TheParent' on line 4
Run Code Online (Sandbox Code Playgroud)
由于TheChild
从继承TheParent
不应该$this
在所谓的parse()
被引用的实例$child
,因此validate()
将是可见的parse()
?
注意:
经过一些研究后我发现这个问题的解决方案要么根据PHP手册中的这个注释来创建validate()
函数,尽管我不完全理解为什么它在这种情况下工作. protected
第二个解决方案是在父进程中创建一个abstract protected
方法validate()
并将其覆盖在子进程中(这将是多余的)到第一个解决方案,因为protected
可以从父进程访问子进程的方法?!!
有人可以解释一下继承在这种情况下是如何工作的吗?
Jvd*_*erg 16
其他海报已经指出,需要保护这些方法以便访问它们.
我认为你应该在代码中再改变一件事.您的基类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();
Run Code Online (Sandbox Code Playgroud)
创建一个抽象函数可以确保子类肯定具有该函数,validate
因为必须实现抽象类的所有抽象函数才能从这样的类继承