Moin,
»»Also ich denke ich schreibe eine Klasse (mit PHP) in eine extra Datei, z.B. Klassenname.class
Dann binde ich diese Datei per include() in ein Script ein und kann die Klasse verwenden. Aber was hat das jetzt mit APIs zu tun?
Naja, Extradateien haben mit Klassen genau gar nichts zu tun (und .class ist als Endung äußerst unpraktisch da das zufälligerweise von Java verwendet wird).
Mal OOP in einer Nußschale:
Ein Objekt ist eine Ansammlung von Daten und Operationen über diesen Daten. Die Daten nennt man Eigenschaften, die Operationen nennt man Methoden.
Die Eigenschaften und Methoden sind eigentlich nichts anderes als Variablen und Funktionen wie du sie bisher kennst, bloss das sie halt zu dem Objekt dazu gehören und jedes Objekt seine eigenen Eigenschaften und Methoden haben kann.
Eine Klasse ist quasi ein Bauplan für ein Objekt. In der Klasse wird festgelegt welche Eigenschaften und Methoden das Objekt haben soll.
Damit kann man ziemlich tolle Sachen machen. Glaubst du nicht? Pass mal auf: Nehmen wir an wir würden Autos beschreiben wollen (jaja, das Standardbeispiel). Konventionell würdest du dir jetzt ein paar Funktionen schreiben die die Operationen auf den Autos darstellen. Um ein Auto selbst darzustellen würdest du vielleicht ein assoziatives Array (in PHP) oder einen strukturierten Datentyp (in den meisten anderen Programmiersprachen) nehmen:
function auto_starten($auto)
{ $auto["gestartet"] = true; }
function auto_stoppen($auto)
{ $auto["gestartet"] = false; }
function auto_neu()
{ $auto["gestartet"] = false; return $auto;}
Zwei Sachen fallen auf:
Ich habe überall "auto_" davorgeschrieben, das wird später auf jedenfall notwendig sein, wenn wir auch noch andere Sachen die man starten oder stoppen kann nachbilden wollen. Damit muss man immer rechnen wenn man schreiben will, was sich wiederverwenden lassen soll.
Jeder Funktion muss das Auto auf dem sie operieren soll als erster Parameter übergeben werden, anders geht's nicht. Globale Variablen sind bei modularer Programmierung eine Todsünde da sie dazu neigen zu kollidieren.
So, jetzt machen wir das ganze mal objektorientiert:
class Auto {
var $gestartet;
function Auto()
{ $this->gestartet = false; }
function starten()
{ $this->gestartet = true; }
function stoppen()
{ $this->gestartet = false; }
}
Was fällt auf:
Die Funktionen können benannt sein wie sie wollen da Objekte unterschiedlicher Klassen unterschiedliche Funktionen haben und diese nicht miteinander verwechselt werden können.
Wir müssen das Ding was bearbeitet werden soll nicht mehr mit übergeben, es ist stets in $this verfügbar.
Eigenschaften und Methoden eines Objektes werden in PHP mit -> angesprochen.
Mit einem objektorientierten Auto zu arbeiten ist jetzt ganz einfach:
$auto1 = new Auto(); // Auto erzeugen
$auto1->starten(); // Auto anlassen
Vorteile: Der Code in der Klasse ist vollkommen unabhängig von dem Code ausserhalb, sollte er zumindest sein. Wir können jetzt etwa eine Klasse AltesAuto schreiben die nur bei jedem zweiten Mal anspringt (oder so) und müssen dazu nur den Klassennamen, die starten()-Funktion der neuen Klasse sowie die new-Aufrufe ändern anstatt im Prefix jeder Funktion und jedes Aufrufes rumzufummeln.
Andere Sprachen wie Java haben darüberhinaus noch ganz andere Möglichkeiten was die Zugangsbeschränkungen angeht: Da kann der Programmierer einer Klasse festlegen dass alle anderen Klassen keinen Zugriff auf bestimmte Elemente haben sollen. Das ist wichtig um die bereits von meinen Vorrednern erwähnte konsistente API durchhalten zu können: Wenn jemand von aussen gar nicht erst an bestimmten internen Details (die sich jederzeit ändern können, weil sie eben nicht für den externen Zugriff vorgesehen sind) rumspielen kann, dann kommt er auch nicht in Versuchung das zu tun.
Etwas ganz wichtiges geht in PHP aber auch noch: Vererbung. Wenn du eine Klasse bauen willst die das gleiche tun soll wie eine bereits existierende Klasse, nur eben ein bisschen anders bzw. erweitert, dann erbst du einfach von dieser Klasse. Deine neue Klasse enthält dann alle Methoden und Eigenschaften der Elternklasse, plus die Teile die du ausgetauscht bzw. verändert hast. Zum Beispiel ein buntes Auto:
class FarbigesAuto extends Auto {
var $farbe;
function anmalen($neuefarbe)
{ $this->farbe = $neuefarbe; }
function abwaschen()
{ $this->farbe = "nix"; }
function FarbigesAuto($farbe = "nix")
{ $this->farbe = $farbe; $this->gestartet = false;}
}
Zusätzlich zu der Möglichkeit das Auto anzuhalten bzw. zu starten kann man dieses Auto auch noch anmalen. Der Code zum Starten/Stoppen muss aber nicht noch einmal aufgeschrieben werden, und das beste ist: Wenn jemand den Code von dem geerbt wird verändert (verbessert) dann profitiert die erbende Klasse automatisch davon.
Im Allgemeinen mag ich Objektorientierung sehr, wenn es darum geht viele gleichartige Dinge zu haben oder auch nur vorzusorgen irgendwann mal viele davon haben zu können (Zero-One-Infinity nicht vergessen).
--
Henryk Plötz
Grüße aus Berlin