gpt4 book ai didi

php - PHP中的多重继承

转载 作者:IT老高 更新时间:2023-10-28 11:51:42 25 4
gpt4 key购买 nike

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

留言
-- 短信
-------- InvitationTextMessage
-- 电子邮件消息
-------- InvitationEmailMessage

这两种 Invitation* 类有很多共同点;我很想有一个共同的父类,邀请,他们都会继承。不幸的是,它们与当前的祖先也有很多共同点……TextMessage 和EmailMessage。这里是多重继承的经典愿望。

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

谢谢!

最佳答案

Alex,大多数情况下,您需要多重继承表明您的对象结构有些不正确。在您概述的情况下,我认为您的类(class)责任过于广泛。如果消息是应用程序业务模型的一部分,它不应该关心渲染输出。相反,您可以分担责任并使用 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);

这样你可以为 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);

请注意,MessageDispatcher 将根据传递的 Message 对象中的 type 属性来决定是作为 HTML 还是纯文本发送。

// 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 类中完成,发送算法委托(delegate)给 Dispatcher。这称为策略模式,您可以阅读更多内容 here .

关于php - PHP中的多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/90982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com