2016-06-22 8 views
1

Lets sagen, ich habe diesen Code:Multi-Level-Vererbung in PHP-Klassen

class A { 
    ... 
} 

class B extends A { 
    ... 
} 

class C extends B { 
    ... 
} 

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

Anders als eine schlecht Architektur oder schlechtes Design wird dies keine Auswirkungen haben auf PHP/Webserver (Apache/Nginx) Leistung, wenn Das Skript wird ausgeführt?

Wenn dies nicht empfohlen wird, um solche Multi-Level in PHP-Klassen zu haben, können Sie erklären warum?

Hinweis: zusätzlich zu den Antworten, die ich habe ich this hier lassen, die hilfreich ist auch

+0

Scheint mir gut, aber das Beispiel ist extrem eng. –

+0

Ich würde mir wahrscheinlich keine Gedanken über die Auswirkungen auf die Performance machen, es sei denn, Sie kommen in eine viel tiefer verschachtelte (sprich: unrealistische) Vererbung, oder der Inhalt Ihrer Klassen ist extrem dicht. Wenn das Design Ihrer Anwendung fordert, dass es (also) 20 Vererbungsebenen gibt, dann ist es so. Je nach Ihren Anforderungen kann dies zu einem Kompromiss zwischen Wartbarkeit/Lesbarkeit und Leistung führen. –

+0

Wer sagt, dass es eine schlechte Übung ist? (Könnten Sie einige Quellen verlinken?) –

Antwort

1

Mein erster Gedanke war, dass dies nicht gut für die Vererbung sein kann, aber nach dem Testen scheint es okay. Es gibt jedoch andere Möglichkeiten, dies zu erreichen.

Abstrakte Klassen oder Interfaces können sinnvoll sein.

Abstrakte Klassen sind genau wie andere Klassen, aber sie können nicht instanziiert werden. Es gibt auch abstrakte Methoden, die von konkreten Klassen implementiert werden müssen.

Jetzt kann diese Klasse wählen, die abstrakten Methoden zu implementieren oder auch nicht weitere Logik hinzuzufügen, die von ihr benötigt wird.

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

Dies ist eine konkrete Klasse und alle abstrakten Methoden müssen hier umgesetzt werden, wenn nicht bereits diejenigen, die umgesetzt werden können wieder außer Kraft gesetzt werden.

Schnittstelle auf eine einfache und grobe Weise ist eine Tasche von Methoden. Sie sagen dem Entwickler einfach, wenn Sie dieses Werkzeug verwenden wollen. Diese Methoden sind nicht als abstrakt deklariert, können aber nicht in der Schnittstelle implementiert werden.

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

Eine Schnittstelle kann durch eine andere Schnittstelle erweitert werden, die nur ist mehr Methoden zur Schnittstelle

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

interface iC { 
    public function doAnything(); 
} 

und umgesetzt Zugabe von Klassen

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 
    } 
} 

Der Vorteil von Schnittstellen hinzugefügt, dass ein Klasse oder Zusammenfassung kann mehr als einen implementieren

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

Diese völlig in Ordnung zu sein scheint. PHP unterstützt nur einzelne Vererbung - Sie können also nur von einer Klasse erben. Wenn Sie mehr Funktionalität in einer Klasse benötigen, aber die Funktionalität in einer übergeordneten Klasse nicht erhalten können, können Sie auch die Verwendung von traits in Erwägung ziehen. Traits versuchen das Problem der einzelnen Vererbung zu lösen - auch wenn es kein Problem per se ist.

Wenn Sie Ihre Klassen richtig aufbauen, erhalten Sie eine schöne Kette der Vererbung, die keine negativen Einflüsse auf Apache/Nginx hat.