Objektorientiert programmieren

Objektorientiertes programmieren wird auch kurz als "OOP" bezeichnet.

Die Vorteile liegen in der Modularisierung, also das aufteilen in kleine Codeblöcke und in der Flexibilisierung, also dem einfachen Zugriff auf die einzelnen Codebausteine. Mit Schleifen und Fallunterschiede bestimmen wir den Ablauf von dem Programm und sind auch in der Lage, mit Funktionen zu arbeiten und Werte zu verändern. Dieses teilweise starre Konzept wird durch die OOP gebrochen, indem die Funktionalitäten in logische Einheiten (Klassen und Objekte) geteilt wird.


Geschichte der OOP in PHP

PHP gehört nicht zu den Sprachen, die als Wegbereiter für die objektorientierte Programmierung zählen. Inzwischen bewegt sich PHP aber auf gleicher Augenhöhe wie andere Programmiersprachen für das Web. In Zeiten von PHP 4 setzte sich die Modularisierung recht langsam durch. Webprojekte haben zu der Zeit auch noch weniger Code, wodurch sich ein Vorteil der OOP kaum bemerkbar machte. Zudem waren die Möglichkeiten von PHP 4 noch recht beschränkt. Mit PHP 5 und der zugrunde liegenden Zend Engine 2 änderte sich das Konzept der OOP fast vollständig. Der neue Erfolg erreichte sogar, dass kein bekanntes Open-Source-Projekt auf PHP-Basis mehr ohne OOP auskommt. Im Laufe der Zeit kamen noch ein paar Neuerungen hinzu. In PHP 7 wurde die Engine komplett überarbeitet, wodurch ein deutlicher Performancegewinn zu verzeichnen ist. Neben neue Fehlerlevel und anonymen Klassen gibt es immer wieder neue Detailverbesserungen. Seit PHP 8 gibt es weitere Neuerungen beim Definieren und Initialisieren von Objektattributen.


Klassen und Objekte – Grundbegriffe

In der objektorientierten Programmierung geht es um Objekte. Diese Objekte sind wie Objekte aus dem echten leben. Wir können damit Autos, Möbel, Personen, Tiere und alles andere vorstellbare erstellen. In der OOP wollen wir aber nicht alle Details von Objekten beschreiben, sondern viel mehr einige Aspekte des Objekts. Ein Objekt besteht aus Eigenschaften und Methoden. Die Eigenschaften vom Objekt "Auto" können die "Farbe" oder der "Motor" sein. Die Methode enthält Funktionalitäten, die dem Objekt zur Verfügung stehen. Zum Beispiel "fahren()". Der Unterschied zwischen "Eigenschaft" und "Methode()" ist bereits an den Klammern zu erkennen.


Was ist nun die Klasse?

Eine Klasse definiert die Struktur eines Objekts. Damit sind die Eigenschaften und Methoden des Objekts gemeint. Die Klasse bestimmt also die Eigenschaften und Methoden für alle einzelnen Objekte.

Klasse, Objekte und Instanzen in der Übersicht

Die Eigenschaften haben noch keinen Wert, die Klasse gibt ja nur die Struktur vor. Die Autos, die aus der Klasse entstehen, sind dann die Objekte. Das Objekt ist eine Instanz der Klasse, darum muss ein Objekt instanziiert werden.


Achtung!

Diese Anleitung beschreibt die OOP in PHP7

Seit PHP 8 gibt es eine abgewandelte Syntax, wodurch die Codebeispiele eventuell nicht funktionieren, wenn PHP Versionen verwendet werden, die neuer sind als 7.X

Klassen und Objekte in PHP

Der folgende Code erzeugt eine Klasse. Diese Klasse besitzt die Eigenschaft "farbe" und die Methode "fahren()".

Klasse erstellen

class Auto {
 public $farbe = "Rot";
 public function fahren() {
  echo "Auto fährt";
 }
}

Mit dem Schlüsselwort "class" erstellen wir die Klasse "Auto". Mit dem Schlüsselwort "public" geben wir an, dass von außerhalb der Klasse auf die Eigenschaft zugegriffen werden kann. Nun erstellen wir ein Objekt der Klasse, um damit arbeiten zu können. Dieser Vorgang wird auch "instanziieren" genannt.

Objekt erstellen

$PKW = new Auto();

Das neue Objekt wurde der Variable "$PKW" zugewiesen. Um auf eine Eigenschaft oder einer Methode des Objekts zuzugreifen, wird die Zeichenfolge -> verwendet.

Zugriff auf Methoden und Eigenschaften

$PKW -> fahren();

Eigenschaften

Eigenschaften lassen sich nicht nur auslesen, sondern auch beliebig verändern. Um Eigenschaften auszulesen, schreiben wir:

Eigenschaft auslesen

echo $PKW -> farbe;

Um die Eigenschaft zu verändern, weisen wir mit dem Zuweisungsoperator (=) einen neuen Wert zu.

Eigenschaft verändern

echo $PKW -> farbe;
$PKW -> farbe = "Grün";
echo "<br />Neue Farbe: " . $PKW -> farbe;

Der Wert der Eigenschaft ändert sich nur für das Objekt. Alle anderen Objekte haben weiterhin die Werte, die von der Klasse definiert wurden.


Methoden

Eine Methode enthält beliebig viele Funktionalitäten. Der Zugriff erfolgt ähnlich wie bei den Eigenschaften.

Auf Methoden zugreifen

echo $PKW -> fahren();

Eine Methode kann beliebige Parameter übernehmen.

Werte an Methode übergeben

class Auto {
 public function fahren($tempo) {
  echo "Das Auto fährt: " . $tempo . " km/h";
 }
}
$PKW = new Auto();
$PKW ->fahren(196);

Wie bei Funktionen können wir auch bei Methoden Standardwerte angeben.

Standartwerte in Methoden verwenden

class Auto {
 public function fahren($tempo = 180) {
  echo "Das Auto fährt: " . $tempo . " km/h";
 }
}
$PKW = new Auto();
$PKW ->fahren();

Die Funktion gibt jetzt aus, dass das Auto 180 km/h fährt. Die Übergabe von Parameter erfolgt als Wert. Die einzige Ausnahme sind Objekte. Objekte werden als Referenz übergeben. Dafür müssen diese mit dem &-Zeichen vor dem Parameternamen geschrieben werden.

Objekt an Methode übergeben

class Auto {
 public function fahren(&$tempo) {
  echo "Das Auto fährt: " . $tempo . " km/h";
 }
}
$geschwindigkeit = 210;
$PKW = new Auto();
$PKW ->fahren($geschwindigkeit);

Rückgaben

Eine Methode kann mit "return" genau wie eine Funktion einen Rückgabewert liefern.

Rückgabewert liefern

class Auto {
 public function fahren($tempo) {
  return "Das Auto fährt: " . $tempo . " km/h";
 }
}
$PKW = new Auto();
echo $PKW ->fahren("203");

Die Ausgabe erfolgt erst nach der Rückgabe des Wertes. Wenn mehrere Werte nötig sind, lässt sich das über Arrays realisieren.


this – Zugriff auf Eigenschaften und Methoden

Die Stärke von Methoden zeigt sich erst im Zusammenspiel mit anderen Eigenschaften und Methoden. Wenn wir die Methode oder die Eigenschaft desselben Objekts innerhalb einer Methode aufrufen. Benötigen wir eine Referenz auf das Objekt. Weil aus einer Klasse viele Objekte erzeugt werden können, wissen wir vorher nicht, wie das Objekt heißt, auf das wir referenzieren wollen. An dieser Stelle verwenden wir das Schlüsselwort "this", welches auf das aktuelle Objekt referenziert.

Auf das aktuelle Objekt referenzieren

$this -> Eigenschaft;
$this -> Methode();

Damit können wir auf die Eigenschaften und den Methoden des aktuellen Objekts zugreifen.

Die Methode gibt einen String zurück, der unter anderem den Wert der Eigenschaft "farbe" enthält.

Wert auf Objekt anwenden

class Auto {
 public function lackieren() {
  return "Das Auto hat die Farbe: " . $this -> farbe;
 }
}
$PKW = new Auto();
$PKW ->farbe = "Gelb";
echo $PKW ->lackieren();

Direktzugriff auf Methoden

Der Zugriff auf Methoden kann auch erfolgen, wenn kein Objekt instanziiert wurde. Dazu wird eine Syntax mit doppeltem Doppelpunkt (::) verwendet.

Direkter Methodenzugriff

class Auto {
 public function fahren($kraftstoff) {
  echo "Das Auto fährt mit: $kraftstoff";
 }
}
Auto::fahren("Benzin");
Hinweis

Dieser Aufruf funktioniert nur bei Methoden, die nicht mit this auf das Objekt referenzieren. Bei Eigenschaften funktioniert es gar nicht.


Vererbung

In der Praxis arbeiten wir mit mehr als einer Klasse. Schnell entstehen ganze Klassenhierarchien. Bei der Vererbung übernimmt eine Klasse die Eigenschaften und Methoden von einer anderen übergeordneten Klasse. Am Beispiel "Auto" kann man das gut durchspielen und in weitere Klassen wie "PKW", "LKW", "Wohnmobil", "SUV" usw. unterscheiden. Die haben alle, die Klasse "Auto" gemeinsam, haben aber selber bestimmte Eigenschaften und Methoden. In PHP können wir eine solche Hierarchie mit dem Schlüsselwort "extends" erstellen.

Vererbung

class Auto {
 public $kraftstoff = "Benzin";
}
class LKW extends Auto {
 public $ladeflaeche = "33 Paletten";
}
$meinLKW = new LKW();
echo "Kraftstoff: $meinLKW->kraftstoff<br />";
echo "Ladefläche: $meinLKW->ladeflaeche";

Die neue Klasse "LKW" erweitert die bestehende Klasse "Auto". "LKW" übernimmt alle Eigenschaften und Methoden von der Klasse "Auto" und entwickelt zusätzlich eigene Eigenschaften und Methoden.


Überschreiben

Die erbende Klasse kann alle geerbten Eigenschaften und Methoden überschreiben. Dazu muss die erbende Klasse nur die Eigenschaft oder Methode mit demselben Namen anlegen und einen neuen Wert zuweisen.

Vererbte Werte Überschreiben

class Auto {
 public $kraftstoff = "Benzin";
}
class LKW extends Auto {
 public $ladeflaeche = "33 Paletten";
 public $kraftstoff = "Diesel";
}
$meinLKW = new LKW();
echo "Kraftstoff: $meinLKW->kraftstoff<br />";
echo "Ladefläche: $meinLKW->ladeflaeche";

Indirekter Zugriff auf Methoden

Um aus einer Methode auf eine Methode der übergeordneten Klasse zuzugreifen, ohne zu wissen, wie diese heißt, verwenden wir das Schlüsselwort "parent".

Indirekter Zugriff

class Auto {
 public $kraftstoff = "Benzin";
 public function fahren() {
  return "fährt";
 }
}
class LKW extends Auto {
 public function fahren() {
  return "LKW " . parent::fahren();
 }
}
$meinLKW = new LKW();
echo $meinLKW->fahren();

Fortgeschrittenes

Im weiteren Umgang mit Objekten lernen wir, wie wir Objekte klonen können. Dadurch können wir Objektinstanzen beliebig oft vervielfachen. Auch das schützen oder freigeben von Daten in der OOP stellt einen wichtigen Zugriffspunkt dar, der genauer betrachtet wird.


Weiter mit Formulare