当我想扩展两个父类时,我遇到了一种情况,但php不允许这样做
为什么我不能extend
多个班级,但可以implement
多个interface
。扩展许多课程有什么问题?
在我得到解析错误之前,在我看来这是一件非常明显的事情
这是一种不好的做法吗?如果是这样,有哪些替代方案?
有可能用其他语言吗?
答案 0 :(得分:6)
您可能正在寻找:Multiple Inheritance in PHP。
似乎可以在Python中使用。
答案 1 :(得分:6)
为什么在某些/大多数编程语言中禁止多重继承与钻石问题http://en.wikipedia.org/wiki/Diamond_problem争论。
如果你有一辆可以游泳和开车的汽车那么简单,因为它继承了车辆和船只在执行移动功能时会发生什么!?
尝试使用接口并遵循策略模式或状态模式。
答案 2 :(得分:3)
答案 3 :(得分:1)
这是一种不好的做法吗?如果是这样,有什么替代方案?
除非语言是专门为它设计的,否则。考虑一下,您有两个类A
和B
。这两个类都提供了一个公共方法foo()
,它具有相同的签名(在PHP中并不难)。现在,您创建了一个C
类,它同时扩展了A
和B
。
现在,您致电C.foo()
。如果没有明确的说明,解释器如何知道要调用哪个版本的foo()
?
答案 4 :(得分:1)
PHP不支持它。但是,它可以使用runkit,APD或仅重写__call和__get来模拟来模拟多个类的继承。 Symfony(我很少推荐)也为多重继承提供了“sfMixin”或“sfMixer”。
答案 5 :(得分:1)
实现相同方法的单独类不是反对多重继承的好参数,因为当前可以实现多个接口。您无法使用相同的方法实现两个接口。引自http://www.php.net/manual/en/language.oop5.interfaces.php:“一个类不能实现两个共享函数名的接口,因为它会引起歧义。”
答案 6 :(得分:0)
我知道这个问题是2岁,但我只是遇到了同样的问题。我的解决方法就是这样:如果你有一个常规课程和两个摘要,并希望扩展它们,例如abstract class AbstractOne
和abstract class AbstractTwo
,你可以说:
abstract class AbstractOne extends AbstractTwo {
}
然后像这样添加到主类:
class MyMainClass extends AbstractOne {
}
这样,它继承了AbstractOne和AbstractTwo。