Alex, na maioria das vezes você precisa de herança múltipla é um sinal de que sua estrutura de objeto está um tanto incorreta. Na situação que você descreveu, vejo que você tem responsabilidade de classe muito ampla. Se Message fizer parte do modelo de negócios do aplicativo, ela não deve se preocupar com a renderização da saída. Em vez disso, você pode dividir a responsabilidade e usar o MessageDispatcher, que envia a mensagem passada usando texto ou backend html. Não sei seu código, mas deixe-me simular desta forma:
$m = new Message();
$m->type = 'text/html';
$m->from = 'John Doe <jdoe@yahoo.com>';
$m->to = 'Random Hacker <rh@gmail.com>';
$m->subject = 'Invitation email';
$m->importBody('invitation.html');
$d = new MessageDispatcher();
$d->dispatch($m);
Desta forma, você pode adicionar alguma especialização à classe Message:
$htmlIM = new InvitationHTMLMessage(); // html type, subject and body configuration in constructor
$textIM = new InvitationTextMessage(); // text type, subject and body configuration in constructor
$d = new MessageDispatcher();
$d->dispatch($htmlIM);
$d->dispatch($textIM);
Observe que MessageDispatcher tomaria a decisão de enviar como HTML ou texto sem formatação, dependendo da type
propriedade no objeto Message transmitido.
// in MessageDispatcher class
public function dispatch(Message $m) {
if ($m->type == 'text/plain') {
$this->sendAsText($m);
} elseif ($m->type == 'text/html') {
$this->sendAsHTML($m);
} else {
throw new Exception("MIME type {$m->type} not supported");
}
}
Para resumir, a responsabilidade é dividida entre duas classes. A configuração da mensagem é feita na classe InvitationHTMLMessage / InvitationTextMessage e o algoritmo de envio é delegado ao despachante. Isso é chamado de padrão de estratégia, você pode ler mais sobre ele aqui .