2011-01-13 8 views
5

Ich versuche mein Wissen über OOP in PHP zu verbessern und habe abstrakte Klassen und Interfaces erforscht.Real World Beispiele für erweiterte OOP-Funktionen für PHP

Was ich gelernt habe

  • Sie beide Klassen sind, die selbst nicht instanziiert werden kann, sondern olny erweitert (umgesetzt im Falle von Schnittstellen) werden kann
  • Abstrakte Klassen bieten Methoden und Eigenschaften für die anderen Klassen die erweitern sie.
  • Wenn eine Klasse eine abstrakte Methode verwendet, muss die Klasse selbst ebenfalls abstrakt sein.
  • Wenn eine abstrakte Methode in einer abstrakten Klasse definiert ist, müssen alle untergeordneten Klassen die Details dieser Methode definieren. Methoden, die nicht als abstrakt definiert sind, können wie normale Methoden verwendet werden.
  • Schnittstellen definieren, welche Methoden eine Klasse, die sie implementiert, haben muss. Die Funktionalität der Methoden ist nicht in der Schnittstelle definiert, die Schnittstelle bietet lediglich eine Liste von Methoden, die in der Kindklasse enthalten sein müssen.
  • Eine Schnittstelle definiert keine Eigenschaften.
  • Klassen können so viele Schnittstellen implementieren, wie sie wollen, aber sie müssen ein Verfahren für jede der Schnittstellen definieren sie

implementieren denke ich, dass die Grundlagen abdeckt. Bitte zögern Sie nicht, wenn Sie denken, dass es etwas gibt, was ich verpasst habe.

Was ich gerne wissen würde, ist, wenn es reale Beispiele für die Implementierung dieser Klassen gibt, insbesondere die Interface-Klasse. Kennt jemand Open-Source-Anwendungen, die sie verwenden, die ich durchsuchen kann, um sie besser zu verstehen und zu sehen, wo und wann sie effektiv verwendet werden? Ich bin auf Buchbeispiele gestoßen, die Tiere benutzen, die die Wichtigkeit dieser Klassen nicht demonstrieren.

Antwort

1

Kein Beispiel aus der realen Welt, aber ein Designmuster, auf das normalerweise Interfaces und abstrakte Klassen treffen, ist die . Siehe Link für Beispielcode.

Im Allgemeinen wird "Programmierung gegen eine Schnittstelle" als gute OO-Praxis angesehen, da es konkrete Implementierungen entkoppelt und Sie leichter für andere Implementierungen, z.statt für eine bestimmte Klasse zu fragen

public function fn(ConcreteClass $obj) 
{ 
    $obj->doSomething() 
} 

Sie fragen nur, dass es einen bestimmten Satz von Methoden liefert

public function fn(MyInterface $obj) 
{ 
    $obj->doSomething() 
} 

Schnittstellen auch necken auseinander große Erbe Strukturen helfen. Da PHP nur Einzel Vererbung unterstützt, werden Sie oft Hierarchien wie diese:

BaseClass -> Logger -> Auth -> User 

wo jede dieser spezifischen Aspekte enthält in diesen Klassen verwendet. Mit einer Schnittstelle, tun Sie nur

User implements Loggable, Authenticable 

und schließen dann die spezifischen Code über Strategie Patterns oder Zusammensetzung/Aggregation, die letztlich viel besser verwaltbar ist.

Eine Liste von vordefinierten Schnittstellen in PHP siehe meine Antwort auf:

2

PHP kommt mit wenigen Schnittstellen standardmäßig predefinded: http://www.php.net/manual/en/reserved.interfaces.php

PHP enthält auch Standard PHP Library (SPL), die mehr definiert:

Zend Framework ist auch sehr gutes Beispiel, wo solche Konzepte sind benutzt. http://framework.zend.com/

+0

Auch ZF2 in Arbeit Wiki: http://framework.zend.com/wiki/display/ZFDEV2 – joksnet

+0

@Gordon: schauen Sie sich zum Beispiel an: http://www.php.net/manual/en /class.splheap.php – vartec

+1

@Gordon, bearbeitet die Antwort – vartec

0

Wir können sagen, dass Schnittstelle ist rein 100% abstrakte Klasse, aber abstrakt ist nicht. Weil wir viele Funktionen in der abstrakten Klasse definieren. Aber in der Interface-Klasse deklarieren wir immer die Funktion.

1

Der letzte Schlüsselwort verhindert, dass die Klasse von anderen Klassen erweitert werden, zB:

class Parent 
{ 
} 

class Mother extends Parent 
{ 
} 

final class Brother extends Mother /* - This class cannot be extended - */ 
{ 
} 

class Pet extends Brother 
{ 
} 

Die Pet-Klasse wird der besagt, einen Fehler aus: Fatal error: Class Pet may not inherit from final class (Brother)

Dies gilt auch für Methoden zur Verfügung, wenn Sie also tun nicht zulassen, dass die Methoden vererbt werden, was dazu führt, dass die untergeordnete Klasse dieselbe Methode wie eine Überschreibung hat.

http://php.net/manual/en/language.oop5.final.php

Yo verwendet, dass Sie einige reale Welt Beispiele möchte, was Schnittstellen für verwendet werden kann, und eine Datenbank-Abstraktionsschicht

Sie haben 1 Basisklasse, die die grundlegenden Methoden bietet die Datenbank iterieren Daten, aber das würde eine Unterklasse für den Datenbanktyp verwenden, wie MySql, MsSql etc, jeder Datenbanktyp würde seine eigene Klasse haben, aber für die Basisklasse, um sicherzustellen, dass es diese Methoden hat, würden sie alle das gleiche implementieren Schnittstelle.

Beispiel

interface IDatabaseLayer 
{ 
    public function connect(); 
    public function query(); 
    public function sanitize(); 
    //... 
} 

So weiß die Basisklasse, dass MySql und MsSql die oben genannten Methoden haben, wodurch Fehler und ist besser organisiert zu reduzieren.

Bei der Übergabe von Objekten an Klassen, die sicher sein sollen, dass das Objekt einen bestimmten Typ hat, können Sie in PHP5 definieren, welcher Objekttyp in die Methoden als Parameter übergeben werden soll.

können sagen, Sie haben drei Klassen

  • DatabaseCredentials
  • DatabaseConnection
  • DatabaseQuery

Sie im constructuin von DatabaseConnection speziell definieren können, die Sie benötigen eine DatabaseCredentials Klasse wie folgt:

class DatabaseConnection implements Connectable 
{ 
    public function __construct(DatabaseCredentials $ConnectionDetails) 
    { 
     $this->Connect($ConnectionDetails->BuildDSN()); 
    } 
} 

Ein guter Weg, wirklich begonnen zu erhalten ist, indem Sie hier lesen:


Ein weiteres Merkmal von PHP5 Sie Leerzeichen ist Namen aussehen wollen, dies ermöglicht es Sie halten Ihren Code organisiert, haben mehrere Objekte mit dem gleichen Namen, machen das automatische Laden effizienter

Kleines Beispiel:

namespace Database\MySql 
{ 
    class Database{} 
} 

namespace Database\MsSql 
{ 
    class Database{} 
} 

Und Sie können einfach verwenden wie:

use Database; 
$Database = new MySql\Database(); 
+0

Ich habe gelesen, dass der Namespace char \ ist. Ich bin irgendwie verloren, ist es/oder? – Aif

+0

Nein, dein Recht, nur Pseudo-Code – RobertPitt

1

Sie die "PHP patterns" series von Giorgio Sironi in dzone folgen kann oder direkt in his blog, wirklich interessant, wenn Sie interessiert Muster und OOP sind.

Auch Sie könnten einen Blick auf die Best PHP programming book in stackoverflow werfen, wenn Sie ein gutes PHP-Buch benötigen.

Verwandte Themen