PHP Portal » Blog » Interfaces in PHP

Werbung

Interfaces in PHP

geschrieben von

Interface werden eingesetzt, wenn Klassen bestimmte Methoden enthalten müssen, die aber in verschiedenen Ausprägungen vorliegen können. Als einfaches Beispiel sei hier eine Klasse zum protokollieren genannt. Eine einfache Implementierung geschieht meistens direkt:

PHP Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Logger { public function log( $daten ) { // hier werden die zu loggenden Daten verarbeitet, // beispielsweise in eine Datei geschrieben } } class MeineKlasse { private $logger; public function __contruct( Logger $logger ) { $this->logger = $logger; } public function tu_was() { $this->logger->log( 'starte tu_was' ); // mache irgendwas $this->logger->log( 'beende tu_was' ); } }

In diesem abstrakten Beispiel funktioniert das protokollieren wunderbar. Dem Objekt was wir später brauchen wird der Logger übergeben, und dieser protokolliert für uns mit.

Doch was passiert, wenn wir nun nicht mehr in eine Datei protokollieren möchten, sondern in eine Datenbank, oder uns der Programmfehler gleich per E-Mail zugeschickt werden soll? An dieser Stelle kommen die Interfaces zum Einsatz:

PHP Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
interface Logger { public function log( $daten ); } class File_Logger implements Logger { public function log( $daten ) { // schreibe die Daten in eine Datei } } class Database_Logger implements Logger { public function log( $daten ) { // schreibe die Daten in eine Datenbank } } class Mail_Logger implements Logger { public function log( $daten ) { // schicke eine E-Mail } } class MeineKlasse { private $logger; public function __contruct( Logger $logger ) { $this->logger = $logger; } public function tu_was() { $this->logger->log( 'starte tu_was' ); // mache irgendwas $this->logger->log( 'beende tu_was' ); } }

jeder der speziellen Logger muss die Methode log() bereitstellen, und durch den Typehint "Logger" im Konstruktor von MeineKlasse wird auch darauf bestanden, dass das übergebene Objekt ein Logger ist, bzw. dessen Methoden bereitstellt.
Um nun im späteren Programm die Protokollierung von dateibasiert auf datenbankbasiert umzustellen, brauch man nur einen anderen Logger per new instanziieren. An der weiteren Programmierung bzw. Ausführung ändert sich nicht.

Kommentare

aktuell liegen noch keine Kommentare vor

Trackbacks

aktuell sind keine Trackbacks vorhanden