Alex, la mayoría de las veces que necesitas herencia múltiple es una señal de que la estructura de tu objeto es algo incorrecta. En la situación que describiste, veo que tienes una responsabilidad de clase simplemente demasiado amplia. Si Message es parte del modelo de negocio de la aplicación, no debería preocuparse por la presentación de resultados. En su lugar, puede dividir la responsabilidad y usar MessageDispatcher que envía el mensaje transmitido usando texto o backend html. No conozco tu código, pero déjame simularlo de esta manera:
$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 esta manera puede agregar algo de especialización a la clase de mensaje:
$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);
Tenga en cuenta que MessageDispatcher tomaría la decisión de enviar como HTML o texto sin formato dependiendo de la type
propiedad en el objeto Message que se haya pasado.
// 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");
}
}
En resumen, la responsabilidad se divide en dos clases. La configuración del mensaje se realiza en la clase InvitationHTMLMessage / InvitationTextMessage y el algoritmo de envío se delega al despachador. Esto se llama Patrón de estrategia, puede leer más sobre él aquí .