Kontakt aufnehmen

Klassen und Objekte in PHP

Die objektorientierte Programmierung ist heutzutage kaum noch wegzudenken.
Dieses Kapitel beschäftigt sich nur mit den Grundzügen der Objektorientierung und auch nur für PHP , da alles andere den Rahmen sprengen würde.

Grundlegendes

Objekte und Klassen sind prinzipiell das gleiche, nur das Klassen den Typ beschreiben und Objekte die Implementierung sind, so wie Integer ein Datentyp und $a eine Variable vom Typ Integer ist. Klassentypen werden mit dem Schlüsselwort class definiert.

class Klasse  //hier Definition der Klasse
{    
 ...klassenelemente...
}

$Objekt = new Klasse();
//und hier die Implementation (erzeugtes Objekt)

Im Prinzip ist ein Objekt eine Sammlung von Variablen (in der Objektorientierung Felder genannt) mit eigenen Zugriffsfunktionen, den sogenannten Methoden.

Konstruktor

Über das Schlüsselwort new wird eine neue Instanz einer Klasse angelegt und ein sogenannter Konstruktor aufgerufen. Dieser ist nichts weiter als eine Funktion, die zur Initialisierung der Variablen, den sogenannten Feldern der Klasse verwendet wird. Der Konstruktor wird als function deklariert und muss den gleichen Namen wie die Klasse erhalten.

class Klasse 
{
  function Klasse($name) { echo "$name erzeugt!n"; }
}

$objekt=new Klasse("Objekt"); 
//Ausgabe: 'Objekt erzeugt!'

Destruktor

Ein Destruktor ist eine Funktion des Objekts die automatisch bei dessen Zerstörung aufgerufen wird. Leider sind diese wie in C++ oder ObjektPascal in PHP noch nicht umgesetzt.

this

Das Schlüsselwort $this wird innerhalb von Objekten als Zeiger auf sich selbst verwendet. Damit PHP erkennen kann, ob ein Funktionsaufruf oder Variable dem Objekt selbst oder etwas außerhalb gelten muss diesen das Schlüsselwort $this vorangestellt werden.

$name="Name global";

class Klasse 
{
  function Klasse($newname) { $this->name=$newname; }
}
$objekt=new Klasse("Name Objekt");
echo $objekt->name; //gibt $name des Objekt's aus
echo $name;         //gibt globale $name aus

Methoden

Methoden sind die internen Funktionen eines Objekts und dienen eigentlich zum Zugriff und zur Manipulation der Felder.

class Kreis 
{
  var $radius=2;
  function Kreis($radius) { $this->radius=$radius; }
  function flaeche() { return pow($this->radius,2)*pi(); }
  function umfang() { return pi() * $this->radius; }
}

$kreis=new Kreis(4); 
//erzeugt neues Objekt mit Radius 4

echo $kreis->flaeche(); 
//berechnet die Kreisfläche und gibt diese aus

echo $kreis->umfang();  
//berechnet den Umfang des Kreises und gibt diesen aus

Eigenschaften und Felder

PHP stellt in seiner Objektorientierung nicht wirklich Eigenschaften und Felder dar, sie werden durch bereichsabhängige Variablen simuliert.

class Kreis 
{
  var $radius=2;
  function Kreis($radius) 
  {
    $this->radius=$radius;
    $this->flaeche=pi()*$radius*$radius;
  }
}

Man kann in PHP die Felder eines Objekts auf zwei verschiedene Arten deklarieren. Die erste ist das Setzen der Variablen mittels des Schlüsselworts var im Klassenblock. Die zweite ist das Deklarieren der Variable im Konstruktor, allerdings sollte hier das Schlüsselwort $this davor nicht vergessen werden. Der einzige Unterschied zwischen den beiden Wegen ist der, dass bei der Deklaration im Objektblock (außerhalb des Konstruktors) keine Ausdrücke zugewiesen werden können. Das geht nur innerhalb des Konstruktors.

Vererbung / Ableitung

Eine Elternklasse kann ihre Methoden und Felder an eine sogenannt abgeleitete Klasse "vererben". Das bedeutet, dass eine abgeleitet Klasse neben ihren eigenen Methoden und Feldern auch die der Elternklasse besitzen. Ableitungen von Klassen werden mit dem Schlüsselwort extends gekennzeichnet.

class Kreis //Elternklasse

  var $radius;
  function Kreis($r) { $this->radius=$r; }
  function flaeche() { return pow($this->radius,2)*pi(); }
}

class Zylinder extends Kreis //Kindklasse von Kreis

  var $hoehe;
  function Zylinder($r,$h) 
  {
    $this->radius=$r;
    $this->hoehe=$h;  
  }
  function volumen() 
  {
    return $this->flaeche()*$this->hoehe; 
    //Aufruf der Methode flaeche() aus der Elternklasse
  }
}

$kreis=new Kreis(4); 
//Kreisobjekt mit Radius 4 erzeugen

echo $kreis->flaeche(),"n"; 
//gibt die Fläche des Kreises aus

$zylinder=new Zylinder(2,5); 
//Zylinder mit Hoehe 5 und Radius 2 erzeugen

echo $zylinder->flaeche(),"n"; 
//gibt Grundfläche des Zylinders aus

echo $zylinder->volumen(),"n"; 
//gibt Volumen des Zylinders aus

In diesem Beispiel wird eine Klasse namens Kreis mit einem Feld $radius und einer Methode flaeche() zur Berechnung der Fläche definiert. Dann wird eine weitere Klasse mit dem Namen Zylinder definiert, wobei diese durch das Schlüsselwort extends von der Klasse Kreis abgeleitet wird und ein weiteres Feld $hoehe sowie eine Methode volumen() erhält. Trotz der Tatsache, dass wir in der Klasse Zylinder keine Methode flaeche() und kein Feld $radius definiert haben, können wir trotzdem auf diese zugreifen und erhalten sogar das korrekte Ergebnis!

Zugriff auf Elternklassen

Wird in einer Kindklasse eine Methode deklariert, die den Namen einer Methode der Elternklasse hat, so wird diese "überschrieben". Um in diesem Fall trotzdem noch auf die Implementation der ererbten Methoden zugreifen zu können, gibt man den Namen der Elternklasse gefolgt von zwei Doppelpunkten :: und dem Methoden- oder Feldbezeichner an.

class Mutter 
{
  var $name="Mutter";
  function get_name() 
  { echo "Mutternklasse: ",$this->name,"n"; }
}

class Kind extends Mutter 
{
  var $name="Kind";
  function get_name() 
  {
    Mutter::get_name();
    echo "Kindklasse: ",$this->name,"n";
  }
}

$kind=new Kind();
$kind->get_name();
unset($kind);

Hier kann man gut erkennen, das sowohl die Methode get_name() der Klasse Mutter als auch die der Klasse Kind auf das selbe Feld zugreifen, beides aber unterschiedliche Methoden sind.

Du arbeitest in einer Agentur oder als Freelancer?
Dann wirf doch mal einen Blick auf unsere Software FeatValue.

Weiterlesen: ⯈ PHP und MySQL

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Cookie-Einstellungen

Helfen Sie dabei, uns noch besser zu machen. Wir nutzen Cookies und ähnliche Technologien, um die Website auf Ihre Bedürfnisse anzupassen. Zur Datenschutzerklärung

Auswahl speichern