PHP 5 und Interfaces

Original von easteregg
wozu braucht man das? mir wird aus dem codebeispiel kein sinvoller hintergrund dafür klar.

Nun mit dem Interface fasst man sozusagen eine bestimme Gruppe an Objekten zusammen, die bestimmte Methoden zur Verfügung stellen müssen. Hat man nun z.B. eine Liste von Objekten die "Entsaftbar" implementieren, so muss man nicht wissen, welchen genauen Typ diese Objekte nun haben, sondern es reicht zu wissen, dass sie Entsaftbar implementieren, um dann die Methode entsaften aufrufen zu können.
Hätte man die Interfaces nun nicht, hätte man mangels Mehrfachvererbung in diesem Fall keine andere Möglichkeit als den genauen Typ jeden Objekts zu ermitteln, es zu casten und könnte dann erst entsaften aufrufen.
(Ich gehe mal davon aus, dass PHP-Interfaces in etwa den Java-Interfaces gleichen, was mir nach Lektüre des verlinkten Textes auch der Fall zu sein scheint.)
 
Eine Schnittstelle (englisch: interface) ist eine vollständig abstrakte Klasse, die nur Namen und die Signaturen der enthaltenen Methoden vereinbart. Eine Klasse kann eine beliebige Anzahl an Schnittstellen über das Schlüsselwort implements implementieren.
 
aber diese fall tritt ja an sich gar nicht ein, wenn ich nur mit meinen eingenen klassen arbeite?
ist das nicht nur relevant, wenn ich fremdcode verwende?
 
Nicht wirklich.
Hier mal ein (sehr konstruiertes) Beispiel:
Du willst ein Zeichenprogramm schreiben(vergessen wir erstmal, dass es um PHP geht). Dies soll verschiedene geometrische Objekte darstellen können wie Kreise, Polygone, etc.. Alle diese Objekte sollen darstellbar sein, implementieren also eine Methode draw(). Diese Eigenschaft fasst du nun in dem Interface Drawable zusammen. Nun willst du alle angelegten Objekte in einer Liste verwalten. Zur Darstellung willst du diese Liste durchgehen und jeweils draw() aufrufen. Dank Interfaces ginge soetwas:
(Pseudocode: )
Code:
Drawable[] objs = ...;
objs.add(new Circle(...));
objs.add(new Rectangle(...));
objs.add(new Triangle(..));
...
for(i in objs)
    i.draw();

Hättest du nun keine Interfaces ginge dies nicht und du müsstest entweder verschiedene Listen für jeden Typ führen oder jeweils überprüfen, um welchen Typ es sich handelt und dann casten.
Das ist nur ein einfaches Beispiel für die Verwendung von Interfaces, es gibt noch mehr Situationen in denen sowas sinnvoll wird.
 
aber genau sowas ähnliches habe ich in php bis dato immer mit der funktion is_callable umgesetzt, einfach vorher geprüft und dann gecasted oder eben nen fehler ausgegeben.
 
Nun, mit Interfaces ist sowas weitaus sauberer und weniger fehleranfällig. Vorallem kann der Compiler somit besser nachvollziehen, ob dein Code in Hinblick auf die Typen gültig ist, und somit werden derartige Prüfungen zur Laufzeit unnötig.
 
Zurück
Oben