Hi!
Es tut mir leid gestehen zu müssen, dass ich den Sinn von Interfaces immernoch nicht verstanden habe. Bleiben wir mal bei ArrayAccess. Dort werden 4 abstrakte Methoden definiert,
Das "abstract" musst du dir wegdenken, das ist da falsch. Interfaces deklarieren immer abstrakte Methoden (also solche ohne Körper - oder anders gesagt nur die Methodensignatur) und das wird nicht weiter gekennzeichnet.
dann wird eine Klasse erstellt welche die 4 Methoden nochmal definiert inkl. auszuführenden Code der Methoden. Wenn ich das Interface jetzt weglasse funktioniert alles genauso gut. Ich versteh einfach nicht wozu das Interface und überhaupt wozu nur "leere" Methoden.
Ein Interface ist eine Art Versicherung. Es garantiert, dass die im Interface deklarierten Methoden vorhanden sind, wenn jemand das Interface implementiert. Für PHP ist das nicht zwingend notwendig, denn man kann bei einem Funktionsaufruf beispielsweise einen Parameter haben wollen, ohne einen Typ anzugeben.
function foo($bar) {
$bar->qux();
}
Die Funktion will eine Methode qux() aufrufen. Wenn sie im übergebenen Objekt vorhanden ist, ist alles bestens.
function foo(IQux $bar) {
$bar->qux();
}
Diese Funktion hingegen verwendet Type Hinting. Das heißt, sie will unbedingt etwas vom Typ IQux übergeben haben und PHP überwacht das. Alle übergebenen Objekte müssen nun zwingend von einer Klasse sein, die IQux implementiert hat.
IQux muss kein Interface sein, es kann auch eine Klasse sein. Aber wenn es eine Klasse ist, müssen alle zu übergebenden Objekte von dieser Klasse oder von deren Nachfolgern sein. Auch eine Klasse selbst oder die davon abstammenden garantieren das Vorhandensein von Methoden. Es ist aber nicht immer sinnvoll, solche Verwandschaftsbeziehungen aufzubauen. Hier kommen Interfaces ins Spiel, die es erlauben, Garantien ohne Verwandschaft zu geben, denn Klassen, die dasselbe Interface implementieren müssen nicht verwandt sein.
Für PHP ist das alles nicht weiter tragisch, wenn man sich selbst disziplinieren kann und immer nur solche Objekte übergibt, die die dann aufzurufenden Methoden enthalten. Wesentlich wichtiger sind Interfaces bei typsicheren Sprachen, wo also stets Typen angegeben werden müssen. Gott-Klassen sind nicht so toll, also gibt man als geforderten Typ ein Interface an und kann dann alles mögliche übergeben, Hauptsache, es hat das Interface implementiert.
Du sagst es dient der Identifikation von Klassen die grob umrissen gleiche Aufgaben erledigen. Wozu muss ich die identifizieren können? Irgendwie will es nicht in meinen Kopf. Gibt es keine Beispiele wo ich zwingend ein Interface brauch?
Bei PHP nicht, wenn du nicht mit Type Hinting, einer Art Typsicherung, arbeiten willst, oder etwas verwendest, das damit arbeiten will. Sven gab ja schon Beispiele. Wenn du mit foreach über ein Objekt iterieren willst, muss dessen Klasse das Interface Iterator oder IteratorAggregate implementiert haben. Dann weiß foreach, dass die darin enthaltenen Methoden da sind. Es muss nicht blind darauf zugreifen, sondern kann gleich zu Beginn sagen: kein Interface, keine Iteration. ArrayAccess ist ähnlich. Ohne Interface müsste eine Klasse von einer mehr oder weniger abstrakten Array-Klasse abgeleitet sein, damit man einen Array-Zugriff realisieren kann. Mit Interface kann sie selbständig sein und muss nur die vier im Interface vereinbarten Methoden mit Leben gefüllt haben.
Lo!