2010-04-22 65 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