2011-07-03 56 views
7

可能重复:但是
Can I extend a class using more than 1 class in PHP?你可以在一个类中扩展两个类吗?

我有了几个子类的类,但我现在添加另一个类,我也想成为父母的孩子,我还想利用其他子类中的许多功能。

我以为只是将各自的功能从其他子类移到父类,但是并不认为这是真的需要,因为它只会是这两个子类使用它们,所以希望我可以从主父类和现有的一个子类中扩展。

回答

9

您可以扩展子类来继承其父项和子项的功能,我认为这是您正在尝试的功能。

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 
+0

虽然正如其他人所说,一个类不能从两个班同时继承(即'延伸,B'或东西) – alxbl

+0

这就是我正在考虑这样做,但后来我认为它不会继承主要父母的东西。在这种情况下,哪个班级是家长?你如何从非父母访问功能/方法? – Brett

+0

从'Your_Class'中,您可以像往常一样使用'$ this-> method()'调用它们......每个'protected'和'public'成员都将被继承。 'Child'是'Your_Class'的父类,但是通过多态性'Parent'的类型提示也会接受'Your_Class'对象。 *我在代码示例中添加了一些细节以显示* – alxbl

8

没有php是单一继承语言。如果你可以在php 5.4中查找即将发布的功能,那就是特质。

2

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

0

你可以通过向后思考来做到这一点,然而这取决于具体情况。如果你想让你的课程分开,除非你给我们更多的信息,否则没有人可以给你一个关于如何构建对象和继承的很好的答案。另外请记住,过于担心如何让课堂结构正确是小型项目的负担,您也可以将这些方法转移并加以处理,以后再学习更多关于课程的知识。

8

就像上面说的@morphles一样,这个特性将在php 5.4中作为traits(像其他语言中的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(); 
+0

感谢解决方案示例:) – Brett

+0

不客气)如果您无法根据需要更改它,请写信给我。 – RReverser

+0

如果ComposeAB需要实现指定A和B中的函数的接口,这样做会工作吗?想象一下,如果接口有smthA和smthB,ComposeAB实现了这样一个接口,__call函数是否可以满足接口的要求? – CMCDragonkai

相关问题