PHP中的多重继承

PHP中的多重继承,php,oop,inheritance,Php,Oop,Inheritance,我正在寻找一种好的、干净的方法来解决PHP5仍然不支持多重继承这一事实。下面是类层次结构: 消息 --文本消息 --------邀请短信 --电子邮件消息 --------邀请邮件 这两种类型的邀请课程有很多共同之处;我希望有一个共同的父类,Invitation,它们都将从中继承。不幸的是,他们与现在的祖先也有很多共同之处。。。文本消息和电子邮件消息。这里有多重继承的经典欲望 解决这个问题最轻量级的方法是什么 谢谢 这听起来可能很合适,但是如果没有更多的细节就很难说了。Symfony框架有一个,

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

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

这两种类型的邀请课程有很多共同之处;我希望有一个共同的父类,Invitation,它们都将从中继承。不幸的是,他们与现在的祖先也有很多共同之处。。。文本消息和电子邮件消息。这里有多重继承的经典欲望

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


谢谢

这听起来可能很合适,但是如果没有更多的细节就很难说了。

Symfony框架有一个,你可能想看看它——即使只是为了想法,如果不使用它的话


“设计模式”的答案是将共享功能抽象为单独的组件,并在运行时进行组合。考虑一种方法,将邀请功能抽象为一个类,该类以继承以外的方式与消息类关联。

与Java一样的问题。尝试使用带有抽象函数的接口来解决该问题

也许您可以用“has-a”关系替换“is-a”关系?邀请可能包含一条消息,但它不一定需要“is-a”消息。可能会确认邀请f.e.,这与消息模型不符


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

PHP确实支持接口。这可能是一个很好的选择,这取决于您的用例。

Alex,大多数情况下,您需要多重继承的信号是您的对象结构有点不正确。在你们概述的情况下,我发现你们的班级责任太广泛了。若消息是应用程序业务模型的一部分,那个么它不应该关心呈现输出。相反,您可以拆分责任并使用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);
请注意,MessageDispatcher将根据传递的消息对象中的
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类中完成,发送算法委托给dispatcher。这就是所谓的战略模式,你可以阅读更多相关内容。

我有几个问题要问,以澄清你在做什么:

1) 您的邮件对象是否仅包含邮件,例如正文、收件人、计划时间? 2) 您打算如何处理您的邀请对象?与电子邮件相比,它是否需要特别处理? 3) 如果是的话,它有什么特别之处? 4) 如果是这样,为什么邀请的消息类型需要进行不同的处理? 5) 如果您想发送欢迎消息或确认消息,该怎么办?它们也是新事物吗

听起来您确实在尝试将太多的功能组合到一组对象中,这些对象只应关注保存消息内容,而不应关注如何处理消息内容。对我来说,你看,邀请和标准信息没有区别。如果邀请需要特殊处理,那么这意味着应用程序逻辑,而不是消息类型


例如:我构建的一个系统有一个共享的基本消息对象,该对象被扩展为SMS、电子邮件和其他消息类型。然而:这些并没有进一步扩展-邀请消息只是通过电子邮件类型的消息发送的预定义文本。一个特定的邀请申请将涉及邀请的验证和其他要求。毕竟,您只需将消息X发送给收件人Y,而收件人Y本身应该是一个独立的系统。

这既是一个问题,也是一个解决方案

那么神奇的_call(),_get(),u set()方法呢?我还没有测试过这个解决方案,但是如果创建一个multiherit类呢。子类中的受保护变量可以包含要继承的类数组。multi-interface类中的构造函数可以创建每个被继承类的实例,并将它们链接到私有属性,如_-ext。_-call()方法可以在_-ext数组中的每个类上使用方法_-exists()函数来定位要调用的正确方法__get()和_集合可用于定位内部属性,或者如果您的专家具有引用,则可以使子类和继承类的属性引用相同的数据。对象的多重继承对于使用这些对象的代码来说是透明的。此外,只要_ext数组按类名编制索引,内部对象就可以在需要时直接访问继承的对象。我已经设想过创建这个超级类,但还没有实现它,因为我觉得如果它能工作,可能会导致一些不同的坏编程习惯。

如果我能引用Phil在

PHP和Java一样,不支持多重继承

PHP5.4将是一个试图提供解决方案的平台 对这个问题

同时,你最好重新思考你的课堂设计。你 如果您需要一个扩展API来 你的课

还有克里斯

PHP并不真正支持多重继承,但有一些 (有些混乱)实现它的方法。请查看此URL以获取一些信息 示例:


认为他们都有有用的联系。迫不及待地想尝试traits或者一些mixin…

在Message类的正下方创建一个邀请类怎么样

因此,层次结构如下:

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

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