2010-04-22 46 views
14

在PHP中的类级别允许使用多继承吗?在PHP的类级别允许多重继承吗?

+0

可能的重复,http:// stackoverflow。com/questions/90982/php中的多重继承 – 2010-04-22 12:57:10

+0

我相信接受的答案应该在这里改变,因为在PHP中有一个“多重继承”的解决方法。在[本答案](https://stackoverflow.com/a/46905316/2394254)中描述了这一点,但没有在接受的答案中描述。 – mega6382 2017-11-17 12:01:26

回答

32

多继承存在于Diamond Problem之中,尚未在PHP中得到解决(同意如何解决)。因此,在PHP中没有多继承。

BaseClass 
     /\ 
    /\ 
ClassA ClassB 
     \/
     \/ 
    ClassC 

如果同时ClassAClassB定义自己的方法foo(),一会你在ClassC调用哪个?

鼓励你要么使用object compositioninterfaces(这确实允许多重继承),或者 - 如果你是水平再利用后 - 窥视DecoratorStrategy模式,直到我们有Traits(或Grafts或不管他们会叫,然后)。

一些参考:

+2

了不起的描述谢谢戈登! – 2010-04-22 13:04:58

+2

wooooooo,图形! +1。 – 2010-04-22 13:37:40

4

PHP不支持多继承。

-3

PHP不支持类的多重继承。

+3

它“不支持多重继承”?所以,这意味着它的确如此,对吧? – 2015-11-30 14:41:34

+0

现在你不应该纠正这个问题吗? – mega6382 2017-10-26 05:05:04

2

没有,PHP类只能继承一个类,而不是多个。

3

可以使用方法和属性代表团模仿它,但它不会与is_a()instanceof工作:

class A extends B 
{ 
    public function __construct($otherParent) 
    { 
     $this->otherParent = $otherParent; 
    } 

    public function __call($method, $args) 
    { 
     $method = array($this->otherParent, $method); 

     return call_user_func_array($method, $args); 
    } 
} 
+0

PLs精心制作我了解了你谈论的要点... – 2010-04-22 13:07:38

+0

哪一点? is_a点?还是代表团? – 2010-04-22 13:08:49

+0

两者都可以详细说明这两点,我是一个新的编码人员不知道这些概念 – 2010-04-22 13:11:01

1

PHP不支持多重继承因为如此,但它确实提供了一些易于重用套方法在多个独立的类中,使用traits。 A trait就像一个类一样书写,但它本身不能实例化。

下面

是几个从PHP手册的例子:

优先顺序示例:

class Base { 
    public function sayHello() { 
     echo 'Hello '; 
    } 
} 

trait SayWorld { 
    public function sayHello() { 
     parent::sayHello(); 
     echo 'World!'; 
    } 
} 

class MyHelloWorld extends Base { 
    use SayWorld; 
} 

$o = new MyHelloWorld(); 
$o->sayHello(); 

输出:

Hello World! 

这里是与冲突解决另一个例子:

trait A { 
    public function smallTalk() { 
     echo 'a'; 
    } 
    public function bigTalk() { 
     echo 'A'; 
    } 
} 

trait B { 
    public function smallTalk() { 
     echo 'b'; 
    } 
    public function bigTalk() { 
     echo 'B'; 
    } 
} 

class Talker { 
    use A, B { 
     B::smallTalk insteadof A; 
     A::bigTalk insteadof B; 
    } 
} 

class Aliased_Talker { 
    use A, B { 
     B::smallTalk insteadof A; 
     A::bigTalk insteadof B; 
     B::bigTalk as talk; 
    } 
} 

欲了解更多信息和深入了解在PHP多重Inhertance

调查Horizontal Reuse for PHP