Alex, sebagian besar waktu Anda membutuhkan multiple inheritance adalah sinyal bahwa struktur objek Anda agak salah. Dalam situasi yang Anda uraikan, saya melihat Anda memiliki tanggung jawab kelas yang terlalu luas. Jika Message adalah bagian dari model bisnis aplikasi, Message tidak akan menangani rendering output. Sebagai gantinya, Anda dapat membagi tanggung jawab dan menggunakan MessageDispatcher yang mengirimkan Message yang diteruskan menggunakan backend teks atau html. Saya tidak tahu kode Anda, tetapi biarkan saya mensimulasikannya dengan cara ini:
$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);
Dengan cara ini Anda dapat menambahkan beberapa spesialisasi ke kelas Pesan:
$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);
Perhatikan bahwa MessageDispatcher akan membuat keputusan apakah akan mengirim sebagai HTML atau teks biasa bergantung pada type
properti di objek Message yang diteruskan.
// 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");
}
}
Singkatnya, tanggung jawab dibagi menjadi dua kelas. Konfigurasi pesan dilakukan di kelas InvitationHTMLMessage / InvitationTextMessage, dan algoritme pengiriman didelegasikan ke dispatcher. Ini disebut Pola Strategi, Anda dapat membaca lebih lanjut di sini .