我如何构建PHP类?

时间:2012-02-05 09:43:10

标签: php class

我有一个父类,让我们说class main { ... },以及它的扩展名,我们称之为class extension extends main { ... }

我的问题是,如何构建另一个名为class messages { ... }的类,我可以在main类和mainextension的扩展类中使用它?除了我所知道的方式之外,像这样调用班级messages

$messages = new messages;
$messages->someMethod();

是否有另一种方法而不必new ...使mainextension类继承messages类中的方法?

4 个答案:

答案 0 :(得分:3)

AFAIK,PHP不支持多重继承,就像其他OOP语言一样。

所以,不,没有别的办法。

是的,你应该创建一个属性并在main类中实例化对象......

class main {
    public $messages;  // may be "protected" or "private" instead

    public __construct()
    {
        $this->messages = new messages();
    }

    public do_something()
    {
        $this->messages->do_something_else();
    }
}

但是,有模拟 多重继承的替代方法。

另一种选择是:https://stackoverflow.com/a/356431/370290 - 但我不建议这样做(即使是自己的作者也没有)。

另一种选择:https://stackoverflow.com/a/358562/370290 - 恕我直言,与前一个一样奇怪。 : - )

从PHP 5.4.0开始,您还可以使用 traits 来实现“多重继承”效果:http://php.net/manual/en/language.oop5.traits.php - 目前这是非常新的。

答案 1 :(得分:1)

您似乎遇到的问题是您无法进行多重继承(class YourClass extends main, messages)。

常见的感觉是,如果你需要多次继承,你的设计就会出错。

每个班级都负责一件事。在这种情况下“扩展”是“IS A”“主”,但它不是“消息”,所以它不应该是那个孩子。如果你需要消息传递功能,就像你建议的那样只是调用它就没有“羞耻感”:你自己找一个知道如何发信息的好对象,然后玩这个。没有必要以不同的方式做到这一点。

如果你正在寻找替代方案(你真的不需要我可以看到它!)你可以把它变成一个带有一堆静态方法的类,并且只需要调用它messages::someMethod(),但我认为在这种情况下,这将被视为一种反模式。

只需使用它:消息由message类型的对象创建。所以你做一个,并调用该函数。最后,如果您需要进行大的更改(数据库连接,日志记录等)以进行消息传递,您可以在友好而舒适的消息传递类中完成所有这些操作。大家都很开心:)

答案 2 :(得分:1)

你不能扩展多个类并扩展主类......如果你从一个抽象类扩展,这只是一件好事。

但你可以做的是将它添加到主类的构造中,如下所示:

//member variable for class main
public $_message = null;

public function __construct()
{
    $this->_message = new Message();
}

然后,只要您需要消息类,只需调用$this->_message +您需要的方法(例如:$this->_message->addMessage()

不要忘记在子类中添加它:

public function __construct()
{
    parent::__construct();
}

答案 3 :(得分:0)

您应该在类中创建一个类。就像在question中一样。

然后,您可以使用$this->someclass->function

注意:构造也需要$this->someclass = new Whatever()