我有一个父类,让我们说class main { ... }
,以及它的扩展名,我们称之为class extension extends main { ... }
。
我的问题是,如何构建另一个名为class messages { ... }
的类,我可以在main
类和main
,extension
的扩展类中使用它?除了我所知道的方式之外,像这样调用班级messages
:
$messages = new messages;
$messages->someMethod();
是否有另一种方法而不必new ...
使main
和extension
类继承messages
类中的方法?
答案 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()
。