Alex, la plupart du temps, vous avez besoin d'héritage multiple, c'est un signal que la structure de votre objet est quelque peu incorrecte. Dans la situation que vous avez décrite, je vois que vous avez une responsabilité de classe tout simplement trop large. Si Message fait partie du modèle commercial de l'application, il ne doit pas se soucier du rendu de la sortie. Au lieu de cela, vous pouvez diviser la responsabilité et utiliser MessageDispatcher qui envoie le message transmis à l'aide du backend texte ou html. Je ne connais pas votre code, mais laissez-moi le simuler de cette façon:
$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);
De cette façon, vous pouvez ajouter une spécialisation à la 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);
Notez que MessageDispatcher prendrait la décision d'envoyer au format HTML ou texte brut en fonction de la type
propriété de l'objet Message transmis.
// 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");
}
}
Pour résumer, la responsabilité est partagée entre deux classes. La configuration des messages est effectuée dans la classe InvitationHTMLMessage / InvitationTextMessage et l'algorithme d'envoi est délégué au répartiteur. C'est ce qu'on appelle le modèle de stratégie, vous pouvez en savoir plus ici .