Dez 09

PHP5 OOP Interfaces

Tag: EntwicklungPhoscur @ 23:31

Zu Deutsch „Schnittstellen“. Ich habe gemerkt, dass dieser Begriff sofort zu einer Fehlinterpretation führt, jedenfalls wars bei mir so. Ich hab diesen ganzen OOP Kram sowieso mind. zehn Mal lesen müssen, bis ich ihn annähernd gerafft hab. Einige Sachen sind mir immer noch unklar.

Die letzten Tage bin ich aber endlich darauf gekommen, wofür man diese Interfaces in PHP verwenden kann.

Zuerst einmal: Was ist so ein Interface?

Interfaces sind Klassen, die bestimmte Funktionen vorbestimmen. Die Funktionen bilden dann eine Schnittstelle, also eine bestimmte Möglichkeit von anderen Objekten angesprochen zu werden. Im Gegensatz zu anderen Klassen werden Schnittstellen implementiert („implements“). Dadurch kann eine Klasse mehrere Schnittstellen haben, aber nur von einer einzigen normalen Klasse abstammen.

Man muss also nur die Schnittstelle kennen, um die Klasse verwenden zu können, die sie implementiert. Anders gesagt, man kann die Klasse so verwenden wie man die Schnittstelle als Klasse verwenden würde.

Sehr konkrete Beispiele liefert PHP selbst mit einigen Schnittstellen:

ArrayAcces: Die Objekte einer Klasse lassen sich wie Arrays ansprechen.
Iterator: Die Eigentschaften einer Objekts lassen sich iterieren, also auf eine bestimmte Weise durchlaufen.

Interfaces lassen sich aber auch noch weit abstrakter verwenden:

Ich schreibe ein Interface Datenbankverbindung, das ich aus praktischen Gründen dokumentiere. Ich weise nochmal darauf hin, dass dieses Interfaces keinen Programmcode enthält, es gibt nur Struktur vor.

Danach schreibe ich einen Dekorierer für meine mysqli Klasse und achte derweil auch etwas darauf, wie PDO aufgebaut ist, denn wahrscheinlich wird das eine weitere mögliche Datenbankverbindung (->Interfacename…) mysqli wird etwas zurechtgebogen und erweitert.

Resultat: Ich kann verschiedene Datenbankklassen nach ein paar Anpassungen verwenden. Ich benutze mysqli, weil es anscheinend die schnellste ist, was MySQL angeht. Letztlich verwende ich Typehints auf „Datanbankverbindung“ und Autovervollständigung für das Interface, welches ich dokumentiert (phpDoc, Zend Studio) habe.

Ich hoffe, ich habe es etwas anschaulicher erklärt, als es das Handbuch tut. Ich erinnere nocheinmal daran, dass dies keineswegs einfach ist und ich selbst lange gebraucht habe es zu verstehen.

5 Kommentare zu “PHP5 OOP Interfaces”

  1. Rio schrieb:

    Nabend,

    also was du da schreibst, ist mehr oder weniger wie isländisch für mich *gg* Verstehe eigentlich garnichts. Aber es scheint, es geht immer weiter voran, und das freut mich.

    Weiter so 😉

    Gruß aus dem Pott,
    der Rio

  2. Phoscur schrieb:

    Ach Mist, hab ich mir fast schon gedacht.
    Eig. versuch ich so zu schreiben, dass es alle verstehen, aber bei OOP müsste ich verdammt weit ausholen… da gibts nicht umsonst Bücher. Ich richte mich daher eher an diejenigen, die einen ähnlichen Stand haben wie ich selbst.

  3. asdwe schrieb:

    „Resultat: Ich kann verschiedene Datenbankklassen nach ein paar Anpassungen verwenden.“

    Sinnvoller wäre so etwas wie eine Oberklasse „Datenbank“ und als Unterklasse „mysqli“, „mysql“ usw… da du so nur EINE ZENTRALE klasse hast die sich darum kümmert. Ich weiß gar nicht genau wie du verschiedene Datenbanken anhand Interfaces verwenden willst. (Maybe interpretiere ich das ganze auch falsch und du meinst Methoden die eine Datenbank haben sollte, die du ins Interface schreibst)

    „Man muss also nur die Schnittstelle kennen, um die Klasse verwenden zu können, die sie implementiert.“
    Sicher? Stell dir ma vor meine Schnittstelle sieht so aus: „tueWas(willWasHaben)“, kannst du die Klasse jetzt verwenden?! Man kann eine Methode nicht benutzen wenn man nicht weiß was sie tut, deshalb immer schön ausführlich dokumentieren, aber das scheinst du ja zu machen^^

  4. Phoscur schrieb:

    >Oberklasse Datenbank
    Ja, genau das habe ich. Ich sehe allerdings vor versch. Verbindungen zuzulassen. Weil PDO mehr kann, aber noch einen Tick langsamer als MySQLi ist. Ich schreibe also mit dem Interface vor, wie sich eine solche Verbindung verhalten muss. Wenn man das Interface beispielsweise auf eine PDO Klasse oder einen entsprechenden Dekorierer anwendet, kann man einfach PDO – und somit auch andere Datenbanken wie PostgreSQL – verwenden.

    >Stell dir ma vor meine Schnittstelle sieht so aus: “tueWas(willWasHaben)”, kannst du die Klasse jetzt verwenden?! Man kann eine Methode nicht benutzen wenn man nicht weiß was sie tut..
    Eben doch. Das ist der Sinn einer Schnittstelle. Sie gibt den Sinn, aber nicht den Code vor. Daher muss ich eben nur die Schnittstelle dokumentieren, nicht die verwendeten Datenbankklassen/-verbindungen

    Bei den PHP vorgegeben Schnittstellen ist es leider ganz anders. Sie geben nicht den Sinn vor, sondern eine syntaktische Anwendung.
    Das erschwert das Verständnis IMO anfangs ungemein, weil die vorgegeben Beispiele nicht das tun, wofür sie eig. da sind.

  5. SPL Grundliegendes - Seite 2 - php.de schrieb:

    […] weil sie einen ganz anderen Sinn haben als echte die Interfaces, die man selbst erstellen kann. PHP5 OOP Interfaces | UGamela Blog <- Ein Artikel den ich geschrieben habe als ich Interfaces verstanden habe. Sie mal von den […]

Dein Kommentar

Du musst eingelogt sein, um einen Kommentar zu schreiben.