2016-06-22 214 views
1

可以說,我有這樣的代碼:多層次繼承

架構或不好的設計
class A { 
    ... 
} 

class B extends A { 
    ... 
} 

class C extends B { 
    ... 
} 

$c = new C(); 
$c->getMethodOrPropertyFromB()->getMethodOrPropertyFromA(); 

其他將在對PHP/Web服務器產生任何影響(阿帕奇/ Nginx的)性能時,該腳本執行?

如果不建議在PHP類中使用這種多級別,您能解釋爲什麼嗎?

注:除了我有我會讓this這裏的答案,這是有幫助的,以及

+0

對我來說似乎很好,但這個例子非常狹窄。 –

+0

我可能不會擔心性能的影響,除非你進入更深的嵌套(閱讀:不現實的)繼承,或者你的類的內容非常密集。如果您的應用程序的設計需要(即)20個級別的繼承,那就這樣吧。根據您的需求,它最終可能是可維護性/可讀性和性能之間的折衷。 –

+0

誰說這是一個不好的做法? (你能鏈接一些來源嗎?) –

回答

1

我最初的想法是,這可能不是很好的繼承,但測試後似乎沒有問題。但是,還有其他方法可以實現這一點,您可能會意識到這一點。

抽象類或接口可能是有意義的。

抽象類就像其他類一樣,但它們不能被實例化。也有抽象的方法必須由具體的類來實現。

abstract class A { 
    //You can also have abstract methods 
    abstract public function doFoo(); 
    abstract public function doBar($when); 

    //Also implemented method which when 
    //called unless overridden will use this logic 
    public function sayHi(){ 
     echo "hi"; 
    } 
} 

現在,這個類可以選擇實現抽象方法,也可以不添加任何進一步需要的邏輯。

abstract class B extends A { 
    public function doFoo(){ 
     //Some code 
    } 
    abstract public function doFooBar(); 
    public function sayBye(){ 
     echo "bye"; 
    } 
} 

這是一個具體的類和所有的抽象方法必須在這裏實現,如果不是已經被執行者可以再次覆蓋。

class C extends B { 
    public function doFoo(){ 
     //Some different code 
    } 
    public function doBar($when){ 
     //Some code 
    } 
    public function doFooBar(){ 
     //Some code 
    } 

    //do not need sayHi() and sayBye() but they will be available. 
} 

接口在一個簡單而粗糙的方式是一袋方法。你只是告訴開發人員你是否要使用這些實現這些。這些方法沒有被聲明爲抽象的,但不能在接口中實現。

interface iA { 
    public function doFoo(); 
    public function doBar(); 
} 

一個接口可以由其它接口,其只是加入更多的方法來接口

interface iB extends iA { 
    public function doFooBar(); 
} 

interface iC { 
    public function doAnything(); 
} 

而且

class A implements iA{ 
    public function doFoo(){ 
     //Some Code 
    } 
    public function doBar(){ 
     //Some Code 
    } 
} 

class B implements iB{ 
    public function doFoo(){ 
     //Some Code 
    } 
    public function doBar(){ 
     //Some Code 
    } 
    public function doFooBar(){ 
     //Some Code 
    } 
} 

增加的優點的接口由類實現的擴展是一個類或摘要可以實現多於一個

abstract class C implements iA, iC { 
    public function doFoo(){ 
     //Some Code 
    } 
} 

class D extends C { 
    //get doFoo() from C implementation and must implement the remaining... 
    public function doBar(){ 
     //Some Code 
    } 
    public function doAnything(){ 
     //Some Code 
    } 
} 
0

這似乎完全正常。 PHP只支持單繼承 - 所以你只能從一個類繼承。 如果您需要班級中的更多功能,但無法獲得父級班級的功能,您還可以考慮使用traits。性狀嘗試解決單遺傳問題 - 即使它本身不是問題。

如果你正確地構建你的類,你會得到一個很好的繼承鏈,這對Apache/Nginx沒有任何不良影響。