Objektorientierte Programmierung in PHP?

Objektprogrammierte Entwicklung ist heutzutage kaum wegzudenken. Man bastelt quasi eine Vorlage, einen Blueprint, der dann an vielen anderen Stellen des eigenen Codes wiederverwendet werden kann.

Man kann sich das so vorstellen, als würde man einen Datumsstempel kreieren, der dann an verschiedenen anderen Stellen, zum Beispiel beim Stempeln einer Unterlage immer wieder eingesetzt werden kann.

Ein netter Nebeneffekt bei der Sache: Der eigene Code wird deutlich Übersichtlicher! (Zumindest in der Theorie).

Klassen und Objekte

Unter einer Klasse versteht man das Grundgerüst. Also alle Funktionen, die zu einer bestimmten Gruppe gehören.

Um das einfacher auszudrücken: Stell dir vor, du besitzt eine Waschmaschine. Jetzt besitzen alle Waschmaschinen gleiche Funktionen und Eigenschaften.

Zum Beispiel haben Sie alle eine Funktion „waschen“ und hoffentlich auch einen Schleudergang.

Die Klasse „Waschmaschine“ ist also mit einer Reihe von Funktionen ausgestattet, die jetzt erst einmal auf alle Waschmaschinen zutrifft:

class Waschmaschine {
    public $MAX_UMDREHUNGEN = "Umdrehungen pro Minute";
    public function waschen(){
        echo "Maschine wäscht";
    }
    public function schleudern(){
        echo "Maschine schleudert";
    }
}

Diese Aussage ist also erst einmal universell gültig für alle Waschmaschinen.

Allerdings steht in deiner Waschküche jetzt vermutlich nicht einfach eine „Waschmaschine“, sondern ein bestimmtes Modell eines bestimmten Herstellers.

Hierfür gibt es Objekte und die Möglichkeit ein Objekt aus einer bestehenden Klasse zu erstellen.

Man sagt dazu auch eine Klasse instanziieren. Also eine Instanz aus einer Klasse erstellen.

In PHP sieht das in etwa so aus:

$Instanz = new Klasse();

//Oder mit unserem Beispiel einer Waschmaschine:
$Waschomat3000 = new Waschmaschine();

Wir erstellen also ein neues Objekt namens „Waschomat3000“. Und dieser Waschomat3000 besitzt alle Klassen und Funktionen, die auch eine Waschmaschine besitzt.

Das bedeutet der Waschomat3000 kann sowohl waschen:

$Waschomat3000->waschen();

// und natürlich auch schleudern...

$Waschomat3000->schleudern();

Wenn man sich das ganze genauer anschaut, ist es jetzt vielleicht schon klar, weshalb das ganze Übersichtlicher ist.

Die Funktionen waschen und schleudern wurden an einer zentralen Stelle, nämlich in der Klasse Waschmaschine definiert.

Man verhindert also unnötige Wiederholung im Code und hält somit das Dry-Prinzip ein: Do not repeat yourself (Wiederhole dich nicht selbst).

Innerhalb einer Klasse auf Attribute und Methoden verweisen mit $this

Jetzt kann man in einer Klasse natürlich nicht einfach den Namen eines Objektes aufführen.

Stattdessen muss man einen Trick anwenden.

Mit dem Zauberwort „$this“ kann man auf die eigene Klasse Referenz nehmen.

Ein Beispiel? Wenn die Waschmaschine nun schleudert, gibt die Funktion die Maximalen Umdrehungen pro Minute zurück, indem Sie mit $this auf sich selbst Referenz nimmt.

class Waschmaschine {
    public $MAX_UMDREHUNGEN = "Umdrehungen pro Minute";
    public function schleudern(){
         return $this->MAX_UMDREHUNGEN;
    }
}

Ohne Instanziierung einer Klasse auf Methoden zugreifen

Es gibt auch die Möglichkeit ohne eine vorangegangene Instanziierung auf die Methode einer Klasse zuzugreifen.

Hierfür verwendet man die doppelte Doppelpunkte-Syntax wie folgt:

class Waschmaschine{
    public function schleudern($umdrehung_pro_minute){
        return "Maschine schleudert mit $umdrehung_pro_minute";
}

Waschmaschine::schleudern("1600U/M");

An sich gibt es keinen Nachteil beim Direktaufruf von Methoden. Wichtig ist nur, dass ein direkter Zugriff nur auf Methoden möglich ist und nicht auf andere Eigenschaften einer Klasse.

Erweitern von Klassen

Manchmal gibt es Waschmaschinen, die neben den klassischen Funktionen wie schleudern, pumpen, spülen und waschen auch noch Zusatzfunktionen besitzen, die aber nur für eine bestimmte Gerätegruppe gilt.

Zum Beispiel könnte ein Waschtrockner die Funktion einer Waschmaschine und eines Trockners kombinieren.

Der Waschtrockner erweitert also die klassischen Funktionen einer Waschmaschine um weitere Funktionen und Attribute.

In PHP könnte das ganze wie folgt aussehen:

class Waschtrockner extends Waschmaschine {
    private $trocknungsdauer = "Länge bis Wäsche trocken ist";
    public function trocknen() {
        // Trocknet die Wäsche
    }
}

Der Waschtrockner kann jetzt also sowohl waschen, schleudern als auch Wäsche trocknen.

Er hat Zugriff auf die Funktionen einer Waschmaschine und eines Waschtrockners.

Es handelt sich also um eine Erweiterung der bestehenden Klasse.

Der Startlauf – Der Konstruktor einer Klasse

Jede Klasse führt beim instanziieren automatisch auch die Methode aus, die in Ihrem Konstruktor hinterlegt wurde.

Den Konstruktor definiert man dabei wie folgt:

class Waschmaschine {
    public function __construct($schleuderzahl) {
        //Anweisung
    }
}
// Instanziiert wird die Klasse dann wie folgt:

$Schleuderwunder3000 = new Waschmaschine("1600U/Min");

Vielleicht hast du jetzt einen etwas besseren Überblick über die Möglichkeiten der Objektorientierten Programmierung in PHP bekommen.

Anfangs ist das Konzept etwas verwirrend. Je länger man allerdings damit arbeitet, desto besser kann man den eigenen Code aufräumen und strukturieren.

Man kann Klassen an anderen Stellen und auch in anderen Projekten wiederverwerten.

Es ist also eine Art Modulbaukasten, den man sich hier erstellt. Zum Beispiel kann man eine Klasse Debug schaffen, die nur dafür da ist, hilfreiche Funktionen zum Debugger des Programmcodes bereitzustellen.