PHP 中的多重继承

2022-08-30 07:40:08

我正在寻找一个好的,干净的方法来解决PHP5仍然不支持多重继承的事实。下面是类层次结构:

消息
-- 文本消息
-------- 邀请文本消息
-- 电子邮件消息
--------邀请电子邮件消息

这两种类型的邀请*类有很多共同点;我很想有一个共同的家长课程,邀请,他们俩都会继承。不幸的是,他们与现在的祖先也有很多共同点......文本消息和电子邮件消息。这里古典的多重继承欲望。

解决问题的最轻量级方法是什么?

谢谢!


答案 1

Alex,大多数时候你需要多重继承是一个信号,你的对象结构有点不正确。在你概述的情况下,我看到你有阶级责任太宽泛了。如果 Message 是应用程序业务模型的一部分,则它不应关注呈现输出。相反,您可以拆分责任并使用 MessageDispatcher 发送使用文本或 html 后端传递的消息。我不知道你的代码,但让我以这种方式模拟它:

$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);

通过这种方式,您可以向邮件类添加一些专业化:

$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);

请注意,MessageDispatcher 将根据传递的消息对象中的属性来决定是以 HTML 形式还是纯文本发送。type

// 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");
    }
}

总而言之,责任分为两类。消息配置在 InvitationHTMLMessage/InvitationTextMessage 类中完成,发送算法委托给调度程序。这被称为策略模式,你可以在这里阅读更多关于它的信息


答案 2

也许你可以用“has-a”关系替换“is-a”关系?邀请可能包含消息,但不一定需要“is-a”消息。可能会确认邀请,这与消息模型不能很好地配合。

搜索“组合与继承”,如果您需要了解更多有关它的信息。


推荐