Alex, meistens ist eine Mehrfachvererbung ein Signal dafür, dass Ihre Objektstruktur etwas falsch ist. In der von Ihnen skizzierten Situation haben Sie die Klassenverantwortung einfach zu weit gefasst. Wenn die Nachricht Teil des Anwendungsgeschäftsmodells ist, sollte sie sich nicht um das Rendern der Ausgabe kümmern. Stattdessen können Sie die Verantwortung aufteilen und MessageDispatcher verwenden, der die über Text oder HTML-Backend übergebene Nachricht sendet. Ich kenne Ihren Code nicht, aber lassen Sie mich ihn folgendermaßen simulieren:
$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);
Auf diese Weise können Sie der Nachrichtenklasse eine Spezialisierung hinzufügen:
$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);
Beachten Sie, dass MessageDispatcher je nach type
Eigenschaft im übergebenen Nachrichtenobjekt eine Entscheidung treffen würde, ob es als HTML oder als einfacher Text gesendet werden soll .
// 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");
}
}
Zusammenfassend ist die Verantwortung auf zwei Klassen aufgeteilt. Die Nachrichtenkonfiguration erfolgt in der InvitationHTMLMessage / InvitationTextMessage-Klasse, und der Sendealgorithmus wird an den Dispatcher delegiert. Dies nennt man Strategiemuster, mehr dazu lesen Sie hier .