当前位置:  开发笔记 > 编程语言 > 正文

PHP中的多重继承

如何解决《PHP中的多重继承》经验,为你挑选了4个好方法。

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

消息
- TextMessage
-------- InvitationTextMessage
- EmailMessage
-------- InvitationEmailMessage

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

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

谢谢!



1> Michał Rudni..:

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

$m = new Message();
$m->type = 'text/html';
$m->from = 'John Doe ';
$m->to = 'Random Hacker ';
$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将根据type传递的Message对象中的属性决定是以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类中完成,发送算法委托给调度程序.这叫做战略模式,你可以在这里阅读更多内容.


...我知道这有点旧(我正在寻找PHP是否有MI ......仅仅是为了好奇)我不认为这是战略模式的一个很好的例子.策略模式的设计使您可以随时实施新的"策略".您提供的实施不具备此类能力.相反,Message应该有"send"函数,它调用MessageDispatcher-> dispatch()(Dispatcher是一个param或成员var),而新类HTMLDispatcher和TextDispatcher将以各自的方式实现"dispatch"(这允许其他Dispatchers这样做)其他工作)
惊人的广泛回答,谢谢!我今天学到了一些东西
不幸的是,PHP并不适合实现策略模式.支持方法重载的语言在这里工作得更好 - 想象一下你有两个同名的方法:dispatch(HTMLMessage $ m)和dispatch(TextMessage $) - 现在在强类型语言编译器/解释器中会自动使用正确的"策略"基于参数类型.除此之外,我认为对新战略实施持开放态度是战略模式的本质.当然这是一件好事,但往往不是一个要求.
假设您有一个类"跟踪"(这只是一个示例),您希望在其中包含调试到文件,发送短信以解决关键问题等常规问题.你所有的课程都是这门课程的孩子.现在假设您要创建一个应该具有这些函数的类"异常"(=`Tracing`的子代).这个类必须是`Exception`的孩子.你如何设计这样的东西*没有*多重继承?是的,你总是可以有一个解决方案,但你总是接近黑客.从长远来看,黑客攻击是一种昂贵的解决方案.故事结局.

2> Matthias Kes..:

也许你可以用'has-a'关系替换'is-a'关系?邀请可能有一条消息,但它不一定需要'is-a'消息.可能会确认邀请函,这与消息模型不一致.

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



3> Simon East..:

如果我可以在这个帖子中引用菲尔......

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

进入PHP 5.4将是试图提供此问题的解决方案的特征.

在此期间,您最好重新考虑您的课堂设计.如果您正在使用类的扩展API,则可以实现多个接口.

还有克里斯......

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

http://www.jasny.net/articles/how-i-php-multiple-inheritance/

认为他们都有有用的链接.迫不及待想要尝试特征或者某些混合...



4> joelhardi..:

Symfony框架有一个mixin插件,你可能想要检查它 - 即使只是想法,如果不使用它.

"设计模式"的答案是将共享功能抽象为单独的组件,并在运行时进行组合.考虑一种方法来将邀请功能抽象为一个类,它以除了继承之外的某种方式与您的Message类相关联.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有