PHP – Einführung in die objektorientierte Programmierung (OOP) – Klassen und Objekte

Mit diesem Beitrag möchte ich euch eine Einführung in die objektorientierte Programmierung geben. Es soll insbesondere um die ersten Strukturen in Form von Klassen und Objekten gehen.

Dieses Tutorial richtet sich an PHP-Neulinge, die ihr erstes „Hallo Welt“-Programm schon geschrieben haben und jetzt in OOP einsteigen wollen.


Begriffsklärung Klasse und Objekt

Unter einer Klasse versteht man in der Programmierung den Bauplan für ein Objekt. Die Klasse definiert welche Daten das Objekt halten kann – in sogenannten Instanzvariablen – und welche Funktionalität es anbietet – in sogenannten Methoden.

Wir schreiben bei der Entwicklung also Klassen (Baupläne) und erzeugen während der Laufzeit Objekte (Instanzen der Klasse).


Aufbau einer Klasse

Zunächst ein Beispiel.

Auf die einzelnen Aspekte obigen Codes werden wir im folgenden näher eingehen.

Nomenklatur

Bei der Benennung der Klasse selbst sollte mit einem Großbuchstaben angefangen und in CamelCase fortgefahren werden. Dadurch sind im Programmcode Klassen einfach am ersten Großbuchstaben erkennbar. Die zugehörige PHP-Datei wird exakt so benannt wie die Klasse und lautet somit EineKlasse.php. Es gilt: Nur eine Klasse pro Datei.

Für die Methoden- und Variablennamen sollte wie sonst auch lowerCamelCase verwendet werden. Also den ersten Buchstaben klein schreiben und danach normal in CamelCase.

Unterstriche im Namen entsprechen nicht mehr den heutigen Best Practices.

Zugriff auf Methoden und Variablen definieren

Die einzelnen Methoden und Variablen der Klasse können für einen von drei Bereichen verfügbar gemacht werden. Diese sind öffentlich (public), innerhalb der Klassenhierarchie (protected) und nur in der Klasse selbst (private).

Der Zugriff wird direkt vor einer Variable angegeben oder bei Methoden vor dem Schlüsselwort function.

Klassenkonstanten wie EINE_KLASSEN_KONSTANTE sind immer öffentlich verfügbar.

Instanziierung und Methodenaufruf

Nachdem die Klasse definiert wurde, kann sie im Programm verwendet werden. Dazu erzeugen wir ein neues Objekt mit dem Schlüsselwort new. Dieses erwartet von uns den Bauplan (Namen der Klasse) für das Objekt.

Da wir uns an dieser Stelle im öffentlichen Kontext befinden (also außerhalb der Klasse), können wir nur mit public gekennzeichnete Methoden und Variablen benutzen.

Versuchen wir auf protected oder private zuzugreifen, werden wir einen Fehler erhalten.

Aufruf innerhalb der Klasse

Innerhalb der Klasse werden Variablen und Methoden durch die spezielle Variable $this erreicht.

Für Dinge, die keine Instanz der Klasse benötigen, wie zum Beispiel die Klassenkonstante verwenden wir self.

Getter und Setter

Häufig ist es allerdings erwünscht, dem Anwender Zugang zu einer geschützten Variable zu gewähren und diesen lediglich zu kontrollieren oder nur lesend oder nur schreibend zu erlauben. Dies erreichen wir durch zusätzliche öffentliche Methoden, für die sich die Namen „Getter“ und „Setter“ eingebürgert haben.

Unsere Person hat also zwei Attribute: Name und Telefonnummer. Die Daten sind alle öffentlich verfügbar, wenn auch auf unterschiedliche Art und Weise.

In diesem einfachen Fall sind die Getter und Setter ziemlich überflüssig, verdeutlichen aber ihre Funktion.

In der Praxis könnten wir hier jetzt dafür sorgen wollen, dass alle Personen einer einheitlichen Struktur für die Telefonnummer folgen. Da der Anwender über unseren Setter gehen muss um den Wert zu ändern, können wir hier sehr einfach eine Formatierung vornehmen.

Egal wie wir jetzt die Telefonnummer eingeben, sie wird in unserem erzwungenen Format gespeichert.

Magische Methoden und der Konstruktor

PHP bietet uns innerhalb einer Klasse sogenannte magische Methoden. Magisch deshalb, weil sie normalerweise nicht vom Anwender selbst aufgerufen werden, sondern aufgrund einer bestimmten Bedingungen als „letzte Rettung“ einspringen.

Alle diese Methoden beginnen mit einem doppelten Unterstrich und wir sollten dieses Präfix daher unbedingt bei der Benennung eigener Methoden vermeiden.

Die magischen Methoden sind: __construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone(), __debugInfo().

Sie lassen sich in Gruppen zusammen fassen, auf die ich im Folgenden kurz eingehe.

 Konstruktor

Der Konstruktor übernimmt eine spezielle Aufgabe bei der Instanziierung der Objekte. Klassen können bereits hier Parameter verlangen, die im Konstruktor definiert und bearbeitet werden.

Die Sichtbarkeit des Konstruktors muss public sein. Als Argumente definiert er die Parameter für die Instanziierung. Zu beachten ist, dass ein return im Konstruktor keinen Sinn ergibt – PHP würde dies einfach ignorieren, da die „Rückgabe“ das neue Objekt ist. Die Anwendung sieht dann so aus.

Achtung: Obwohl der Konstruktor natürlich Zugriff auf die geschützten Variablen der Klasse hat, sollten immer die definierten Setter verwendet werden. Andernfalls würde deren zusätzliche Funktionalität verloren gehen.

Das Gegenteil des Konstruktors ist der Destruktor. Definiert über __destruct() enthält er Anweisungen, die ausgeführt werden, bevor ein Objekt „zerstört“ (heißt: aus dem Speicher gelöscht) wird. Dies geschieht automatisch für alle Objekte bei Programmende. Wir werden allerdings sehr selten wirklich einen Destruktor benötigen.

Automatische Umwandlung in Text

Eine weitere magische Methode ist __toString(). Sie wird aufgerufen, wenn das Objekt im Textkontext verwendet wird.

Implementieren wir diese Methode, können wir anschließend im Programm einfach das Objekt selbst in Strings verwenden.

Zugriff auf nicht definierte Variablen und Methoden

Eine große Gruppe der magischen Methoden dient dazu den Zugriff auf nicht vorhandene Variablen oder Methoden zu ermöglichen. Diese sind: __call(), __callStatic(), __get(), __set(), __isset(), __unset().

Unsere Klasse könnten wir folgendermaßen definieren.

Und dann so benutzen:

Die Fehlerbehandlung, die nötig wäre um hier einigermaßen anständige Ergebnisse in echten Programmen liefern zu können, würde hier jeden Rahmen sprengen. Obige Vorgehensweise ist absolut fatal und sollte nur in sehr ausgewählten Spezialfällen angewandt werden! Sie beeinträchtigt die Les- und Wartbarkeit des Programmcodes immens.

Sonderfälle

Die hier nicht näher erklärten magischen Methoden beschäftigen sich mit Spezial- und Ausnahmefällen, die ihre eigenen Kapitel verdienen. Daher werde ich es in diesem Beitrag bei einer bloßen Nennung belassen.


Zusammenfassung

In diesem Artikel habt ihr eine wichtige Grundlage der objektorientierten Programmierung – die Klasse – kennen gelernt. Natürlich gibt es noch viele Feinheiten zu entdecken, die ich euch in jeweils eigenen Artikeln erläutern werden.

Das nächste Kapitel im Rahmen objektorientierter Programmierung könnten die Namensräume (namespace) sein. Einen passenden Beitrag dazu findet ihr hier: Namensräume in PHP.


Hier gibt es noch weitere Tutorials.