在PHP中从父类调用子方法

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因为必须实现抽象类的所有抽象函数才能从这样的类继承