【问题标题】:Can you extend two classes in one class? [duplicate]你可以在一个类中扩展两个类吗? [复制]
【发布时间】:2011-09-27 18:13:59
【问题描述】:

可能重复:
Can I extend a class using more than 1 class in PHP?

我有一个有几个子类的类,但是我现在要添加另一个类,我也想成为父类的子类,但是我也想利用其他子类中的许多功能.

我曾想过将各自的函数从另一个子类移到父类,但认为这并不是真正需要的,因为只有这两个子类会使用它们,所以希望我可以从主父类和现有子类之一扩展。

【问题讨论】:

    标签: php oop extends


    【解决方案1】:

    没有 php 是单继承语言。如果可以的话,您可以在 php 5.4 中查找即将推出的功能,即特征。

    【讨论】:

      【解决方案2】:

      作为是/否的答案,我可以说不。 您不能从 php.ini 中的多个类扩展。但你可以改用interface

      【讨论】:

        【解决方案3】:

        您可以扩展子类以继承其父类和子类的功能,我认为这是您想要做的。

        class Parent
        {
            protected function _doStuff();
        }
        
        class Child extends Parent
        {
            protected function _doChildStuff();
        }
        
        class Your_Class extends Child
        {
            // Access to all of Parent and all of Child's members
        }
        
        // Your_Class has access to both _doStuff() and _doChildStuff() by inheritance
        

        【讨论】:

        • 虽然正如其他人所说,一个类不能同时从两个类继承(即extends A, B或其他东西)
        • 这就是我想做的事情,但后来我认为它不会继承主要父母的东西。在这种情况下,哪个类是父类?您如何从非父级访问函数/方法?
        • Your_Class 你可以像往常一样使用$this->method() 调用它们...每个protectedpublic 成员都将被继承。 ChildYour_Class 的父级,但通过多态性,Parent 的类型提示也将接受 Your_Class 对象。 我在代码示例中添加了一些细节以表明这一点
        【解决方案4】:

        您可以通过向后思考来做到这一点,但这取决于具体情况。如果您想将您的类分开,除非您向我们提供更多信息,否则没有人可以为您提供有关如何构造对象和继承的好答案。还要记住,过于担心类结构的正确性是小型项目的负担,您最好将方法移过来并完成它,稍后再了解有关类的更多信息。

        【讨论】:

          【解决方案5】:

          正如@morphles 所说,此功能将在 php 5.4 中作为特征(如其他语言中的 mixins)提供。但是,如果确实需要,您可以使用这样的解决方法:

          // your class #1
          class A {
              function smthA() { echo 'A'; }
          }
          
          // your class #2
          class B {
              function smthB() { echo 'B'; }
          }
          
          // composer class
          class ComposeAB {
              // list of implemented classes
              private $classes = array('A', 'B');
              // storage for objects of classes
              private $objects = array();
          
              // creating all objects
              function __construct() {
                  foreach($this->classes as $className)
                      $this->objects[] = new $className;
              }
          
              // looking for class method in all the objects
              function __call($method, $args) {
                  foreach($this->objects as $object) {
                      $callback = array($object, $method);
                      if(is_callable($callback))
                          return call_user_func_array($callback, $args);
                  }
              }
          }
          
          $ab = new ComposeAB;
          $ab->smthA();
          $ab->smthB();
          

          【讨论】:

          • 感谢您的解决方法示例 :)
          • 不客气)如果您无法根据需要更改它,请写信给我。
          • 如果 ComposeAB 需要实现一个在 A 和 B 中指定函数的接口,这会起作用吗?试想如果接口有smthA和smthB,ComposeAB实现了这样一个接口,__call函数能满足接口的要求吗?
          • @CMCDragonkai 不。 bugs.php.net/bug.php?id=41162
          • @CMCDragonkai 但是在新的 PHP 中,您可以使用特征来获得更好的多重继承。
          猜你喜欢
          • 2011-09-29
          • 2017-10-04
          • 1970-01-01
          • 2012-05-15
          • 2017-07-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-13
          相关资源
          最近更新 更多