У меня есть родительский класс (я не хочу его редактировать), который содержит некоторые методы
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
. В этом случае отредактированные функции не выполняют мой код, поскольку они не вызываются, даже когда я объявил их (методы в подклассе) как final
или же protected
Что я пропустил?
Если я вас правильно понимаю, вы хотите добавить код в существующие методы из Message
пытаясь переопределить их в вашем унаследованном классе MessageEx
,
Хотя ваш код технически будет работать как опубликовано, ваши методы в MessageEx
(например. createNewMessageSimpleOrAlternativeBody()
) не сможет позвать своих подвесок в Message
потому что методы в Message
являются частными. С помощью final
или же protected
в подклассе работать не будет.
Но то, что вы можете сделать, это вызвать публичный метод ToPart
от Message
с parent::ToPart(..)
который, в свою очередь, будет вызывать частные методы в Message
,
Или, если это не соответствует логике вашего кода, единственный вариант — изменить методы в Message на protected
чтобы они стали доступны в MessageEx
,
Других решений пока нет …