Alex, la maggior parte delle volte hai bisogno di ereditarietà multipla è un segnale che la tua struttura dell'oggetto è in qualche modo errata. Nella situazione che hai delineato vedo che hai una responsabilità di classe semplicemente troppo ampia. Se Message fa parte del modello di business dell'applicazione, non dovrebbe occuparsi del rendering dell'output. Invece, potresti dividere la responsabilità e usare MessageDispatcher che invia il messaggio passato usando testo o backend html. Non conosco il tuo codice, ma fammi simulare in questo modo:
$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);
In questo modo puoi aggiungere alcune specializzazioni alla 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);
Si noti che MessageDispatcher deciderà se inviare come HTML o testo normale a seconda della type
proprietà nell'oggetto Message passato.
// 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");
}
}
Per riassumere, la responsabilità è suddivisa tra due classi. La configurazione dei messaggi viene eseguita nella classe InvitationHTMLMessage / InvitationTextMessage e l'algoritmo di invio viene delegato al dispatcher. Questo si chiama Strategy Pattern, puoi leggere di più qui .