Klassen und Objekte

Obwohl sich PHP durch seine Fähigkeit, mit Klassen umgehen zu könne, von vielen anderen programmiersprachen abhebt, werden Java- oder C++-Programmierer wahrscheinlich ein wenig enttäuscht sein. Es gibt keine strenge "Vererbungslehre" oder Polymorphismus wie in C++. Das macht auch insofern nicht so viel Sinn, wenn man sich vor Augen hält, dass alle definierten Klassen-Objekte nach der Abarbeitung eines PHP-Scriptes wieder zerstört werden und nur temporär im RAM des Servers enthalten sind. Dennoch sind Klassen mächtige Werkzeuge bei der Arbeit mit umfangreicheren Projekten.

Klassen sollte man sich als beliebige Objekte vorstellen, welche Eigenschaften und Methoden haben. Nehmen wir ein Auto als ein Objekt, dann hätte es beispielsweise die Eigenschaften "Baujahr", "Farbe", "Tankinhalt" usw., während Methoden Bremsen() oder Beschleunigen() sein könnten.

Beispiel

Die folgende Klasse definiert eine Person mit den Eigenschaften "Name" und "Geburtsdatum". Als Methode wird alter() implementiert, die das aktuelle Alter in Tagen zurückliefert.

// Eine Klasse fuer Personen
class person {

  // Eigenschaften
  var $name;
  var $geburtsdatum;

  // Konstruktor
  function person($name, $geburt) {
    $this->name = $name;
    $this->geburtsdatum = $geburt;
  }

  // Alter ermitteln
  function alter() {
    $result = (time() - $this->geburtsdatum) / 86400;
    return $result;
  }
}

// Arbeiten mit der Klasse
$p = new person("Ulrich", mktime(0,0,06,6,1972));

echo $p->name . " ist " . $p->alter . " Tage alt.";

Wenn man ein Objekt instanziert, möchte man in der Regel eine feste Ausgangssituation haben, d.h. es sollen bereits Eigenschaften bei der Erstellung übergeben werden können. Dazu bedient man sich eines Konstruktors - in PHP ist das eine Klassenfunktion, die den gleichen Namen tragen muss wie die zugehörige Klasse. Ein wie in Java oder C++ benötigter Destruktor fällt hier weg, da - wie bereits erwähnt - alle Objekte nach Ablauf eines Scriptes sowieso zerstört werden.

Innerhalb einer Klasse wird auf die Eigenschaften und Methoden über das Schlüsselwort $this zugegriffen. Ein Pfeil (->) trennt das Schlüsselwort von der Methode oder Eigenschaft. Ein beliebter Fehler ist es übrigens, beim Abruf einer Eigenschaft die Eigenschaft selbst mit einem $ zu schreiben, da es sich ja eigentlich um eine Variable handelt. Anmerkung am Rande: selbstverständlich können Eigenschaften auch über variable Variablen abgerufen werden, z.B. $this->${"eigenschaft" . $i}.

Jede Klasse kann beliebig viele Eigenschaften und Methoden besitzen. Für Methoden gilt im grossen und ganzen das Gleiche wie für Funktionen.