【问题标题】:PHP: Why isn't it possible to extend more than one class?PHP:为什么不能扩展一个以上的类?
【发布时间】:2010-10-22 14:37:09
【问题描述】:

当我想扩展两个父类时,我遇到了一种情况,但是 php 不允许这样做。
为什么我不能extend 不止一个类,但可以implement 不止一个interface。扩展许多类有什么问题?
在我遇到解析错误之前,这似乎是一件很明显的事情。
这是一个坏习惯吗?如果是这样,有哪些替代方案?
其他语言可以吗?

【问题讨论】:

    标签: php oop class


    【解决方案1】:

    为什么在一些/大多数编程语言中禁止多重继承与钻石问题http://en.wikipedia.org/wiki/Diamond_problem争论。

    简单地说,如果你有一辆可以游泳和驾驶的汽车,因为它继承自车辆和船,在执行移动功能时会发生什么!?

    尝试使用接口并遵循策略模式或状态模式。

    【讨论】:

    • 不仅是方法,还有数据。考虑从“汽车”和“船”派生的混合动力的 $max_speed:它是汽车的最大速度还是船的最大速度?这些字段应该合并还是应该分开存在?如果有 2 个副本,那么如何访问该字段?
    【解决方案2】:

    您可能正在寻找:Multiple Inheritance in PHP

    这在 Python 中似乎是可能的。

    【讨论】:

      【解决方案3】:
      【解决方案4】:

      这是一种不好的做法吗?如果有,有什么替代方案?

      除非该语言是专门为它设计的,否则是的。考虑一下,你有两个类,AB。这两个类都提供了一个公共方法foo(),它具有相同的签名(在 PHP 中并不难)。现在,您创建了一个类C,它扩展了AB

      现在,您拨打C.foo()。如果没有明确的指示,解释器怎么知道要调用哪个版本的foo()

      【讨论】:

      • 它应该引发一个编译错误,例如:方法 foo() 已经在 B 类中定义。我认为程序员应该观察父类的方法冲突,而不是“智能”解释器。
      • @SaltLake:C++ 就是这样做的。 PHP 选择了与 Java 更相似的组织方式,这是一个有效的设计决策。双方各有千秋,可惜我们的蛋糕吃不完。
      【解决方案5】:

      PHP 不支持。然而,它可以使用 runkit、APD 或通过重写 __call 和 __get 来模拟来自多个类的继承。 Symfony(我很少推荐)也为多重继承提供了“sfMixin”或“sfMixer”。

      【讨论】:

        【解决方案6】:

        实现相同方法的单独类并不是反对多重继承的好论据,因为目前可以实现多个接口。你只是不能用相同的方法实现两个接口。引用http://www.php.net/manual/en/language.oop5.interfaces.php:“一个类不能实现两个共享函数名的接口,因为这会导致歧义。”

        【讨论】:

          【解决方案7】:

          我知道这个问题已经有 2 年了,但我只是遇到了同样的问题。我的解决方法是:如果你有一个普通课程和两个摘要,并且想要扩展两者,例如 abstract class AbstractOneabstract class AbstractTwo,你可以说:

          abstract class  AbstractOne extends  AbstractTwo {
          
          }
          

          然后像这样添加到主类中:

          class MyMainClass extends  AbstractOne {
          
          }
          

          这样,它继承了 AbstractOne 和 AbstractTwo。

          【讨论】:

            猜你喜欢
            • 2012-10-03
            • 2011-07-17
            • 1970-01-01
            • 2012-03-01
            • 1970-01-01
            • 2015-11-17
            • 2015-03-09
            • 1970-01-01
            相关资源
            最近更新 更多