Interface

Aus php bar

(Weitergeleitet von implements)
Wechseln zu: Navigation, Suche

Mit einem Interface (dt. Schnittstelle) kann man definieren, welche Methoden eine Klasse haben muss. Dies ist vergleichbar mit der Vererbung von Klassen, mit dem Unterschied, dass das Interface keine Eigenschaften besitzt, sondern nur die Methodenköpfe enthält, die dann von der neuen Klasse überschrieben werden müssen.

Allerdings ist es möglich Konstanten zu definieren, die den Klassen, die das Interface implementieren, zur Verfügung stehen. Die Konstanten sind über den Scope Resolution Operator erreichbar.

Ein Interface ist ähnlich einer abstrakten Klasse, welche nur abstrakte Methoden beinhaltet.

Nützlich ist dies, wenn man mehrere Klassen schreibt, die man alle zu einer Kategorie bzw. einer Funktionalität zusammenlegen kann. Ein Beispiel wäre ein Logger-Interface:

1 interface logger {
2     public function open();
3     public function write($msg);
4     public function close();
5 }

1 //  Beispiel eines Interfaces mit Konstanten
2 interface loggingLevels {
3     const NOTICE = '1';
4     const WARNING = '2';
5     const ERROR = '4';
6 }


Dieses Interface kann man nun mit dem Schlüsselwort implements in einer Klasse einbinden lassen.

 class Logger_MySQL implements logger {
     public function open() {
         mysql_connect(/*....*/);
     }
     
     public function write($msg) {
         mysql_query('INSERT INTO.....');
     }
 
10     public function close() {
11         mysql_close();
12     }
13 }

 class Logger_File implements logger {
     private $fp;
     public function open() {
         $this->fp = fopen(/*....*/);
     }
     
     public function write($msg) {
         fwrite($msg, $this->fp);
     }
10 
11     public function close() {
12         fclose($this->fp);
13     }
14 }

 class Logger_Message implements loggingLevels {
     
     private $level = 0;
 
     public function setLevel($level) {
         $this->level = $level;
     }
     //... weitere Methoden
 }
10 
11 $msg = new Logger_Message();
12 $msg->setLevel(Logger_Message::WARNING);


Wie man hier sieht, wurden die Methoden aus dem Interface überschrieben. Man kann nun weitere Logger-Klassen definieren, die alle mindestens die Methoden open(), write() und close() haben. Somit kann man sich sicher sein, dass das Script auch mit einer anderen Logger-Klasse funktioniert, da es die selben Methoden besitzen muss. Dies verringert die Fehlerquelle beim Erstellen von neuen Logger-Klassen.

Ein Vorteil von Interfaces liegt darin, dass eine Klasse mehrere Interfaces implementieren kann:

1 class IOStream implements IStream, OStream
2 {
3    // ...
4 }


Durch die fehlende Mehrfachvererbung von C++ bleibt dem Entwickler jedoch die Schreibarbeit nicht erspart.



Ein Interface kann beispielsweise dann zur Verfügung gestellt werden, wenn mehrere Entwickler an einem Projekt arbeiten. Jeder Programmierer, der dieses Interface implementiert, wird dann gezwungen alle Methoden des Interfaces zu verwenden und auszuprogrammieren (Methoden eines Interfaces sind ja nicht ausprogrammiert, nur die Methoden-Rümpfe sind deklariert). Sonst reklamiert der Compiler. Teilweise kann man aber auch Adapter-Klassen verwenden: Sie implementieren das Interface, man kann dann aber auch nur einzelne Methoden des Interfaces nutzen. Nachteil von Adapter-Klassen: der Compiler (Java) prüft erst zur Laufzeit; ist die Methode falsch geschrieben, wirft der Java-Compiler eine Exception (Fehler).

Persönliche Werkzeuge