代码之家  ›  专栏  ›  技术社区  ›  Alex Weinstein

PHP中的多重继承

  •  95
  • Alex Weinstein  · 技术社区  · 18 年前

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

    消息
    --短信
    --------邀请短信

    --------邀请邮件

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

    谢谢

    11 回复  |  直到 18 年前
        1
  •  144
  •   Michał Niedźwiedzki    18 年前

    $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类中完成,发送算法委托给dispatcher。这就是所谓的战略模式,你可以阅读更多 here

        2
  •  15
  •   Matthias Kestenholz    18 年前

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

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

        3
  •  10
  •   Community Mohan Dere    9 年前

    如果我能引用菲尔的话 this thread ...

    进入PHP5.4将是 traits 试图提供一个解决方案

    如果您需要一个扩展API来

    还有克里斯。。。。

    PHP并不真正支持多重继承,但有一些

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

    认为他们都有有用的联系。迫不及待地想尝试一下特质或是一些混搭。。。

        4
  •  7
  •   Alexandre Cox    7 年前

    Symfony框架有一个 mixin plugin for this

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

        5
  •  4
  •   MatthewPearson    13 年前

    http://php.net/manual/en/language.oop5.traits.php

    Traits是单继承语言(如PHP)中的代码重用机制。Trait旨在通过使开发人员能够在不同类层次结构中的几个独立类中自由地重用方法集来减少单个继承的一些限制。

        6
  •  3
  •   danio Kouga    18 年前

    decorator pattern 可能是合适的,但没有更多细节很难说。

        7
  •  3
  •   Ralph Ritoch    15 年前

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

        8
  •  1
  •   dave dave    18 年前

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

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

        9
  •  0
  •   DeeCee    18 年前

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

        10
  •  0
  •   Cheekysoft Moz Morris    18 年前

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

        11
  •  -1
  •   nube    14 年前

    因此,层次结构如下:

    消息

    ------短信
    ------电子邮件

    我知道邀请并不是一种真正的信息,它更多的是一种信息功能。所以我不确定这是否是一个好的OO设计。

    推荐文章