PHP扩展类 - 子类方法与父方法重写私有

时间:2018-01-29 17:31:03

标签: php oop extends method-overriding

我有一个父类(我不想编辑它),其中包含一些方法

class Message {

    private function createNewMessageSimpleOrAlternativeBody() {

     ...some code here...
    }

    private function createNewMessageRelatedBody($oPart){

     ...some code here...
    }

    private function createNewMessageMixedBody($oPart){
     ...some code here...
    }   

    public function ToPart($bWithoutBcc = false)
    {
        $oPart = $this->createNewMessageSimpleOrAlternativeBody();
        $oPart = $this->createNewMessageRelatedBody($oPart);
        $oPart = $this->createNewMessageMixedBody($oPart);
        $oPart = $this->setDefaultHeaders($oPart, $bWithoutBcc);

        return $oPart;
    }
}

然后我有另一个类扩展到上面,我想添加我的代码

class MessageEx extends Message {

    private function createNewMessageSimpleOrAlternativeBody() {

     ...some code here + additional code...
    }

    private function createNewMessageRelatedBody($oPart){

     ...some code here + additional code...
    }

    private function createNewMessageMixedBody($oPart){
     ...some code here + additional code...
    }   

    public function ToPart($bWithoutBcc = false)
    {
        $oPart = $this->createNewMessageSimpleOrAlternativeBody();
        $oPart = $this->createNewMessageRelatedBody($oPart);
        $oPart = $this->createNewMessageMixedBody($oPart);
        $oPart = $this->setDefaultHeaders($oPart, $bWithoutBcc);

        return $oPart;
    }
}

但在扩展类中,当我尝试使用公共函数ToPart()时,它告诉我在那里使用的任何方法都是在父类中声明的而不是在这个子类中,我预期它们都是私有的只能在班级$this 内访问。在这种情况下,编辑的函数不执行我的代码,因为即使我已将它们(子类中的方法)声明为finalprotected

,也不会调用它们

我错过了什么?

1 个答案:

答案 0 :(得分:-1)

如果我理解正确,您希望通过尝试在继承的类Message中覆盖它们来向MessageEx中的现有方法添加代码。

虽然您的代码在技术上可以发布,但MessageEx中的方法(例如createNewMessageSimpleOrAlternativeBody())将无法在Message中调用其垂饰,因为{{1}中的方法是私人的。在子类中使用Messagefinal将不起作用。

但您可以使用protectedToPart调用公共方法Message,然后调用parent::ToPart(..)中的私有方法。

或者,如果这不符合您的代码逻辑,那么您唯一的另一个选择是将消息中的方法更改为Message,以便在protected中可以访问它们。