Hauptmenü

Untermenü

OOP PHP5 - Magische Methoden - Konstruktor und Destruktor

1. Erklärung

Hierbei handelt es sich um Methoden, die man auch mit "erzeugen" und "zerstören" beschreiben kann. Also in etwa vergleichbar mit den beiden männlichen Urtrieben "TÖÖÖÖTEN" und "VERMEEEEHREN". Und wie bei Männern auch, erfolgt dies völlig automatisch, ohne dass irgendwas getan werden muss. Scherz beiseite, wir sind ja nicht zum Vergnügen hier.

2. Konstruktor

Dies ist die "erzeugen"- bzw. "VERMEEEHREN"-Methode. Sie wird mit __construct aufgerufen. Also bitte zwei Unterstriche am Anfang. Wenn man nun aus einer Klasse ein Objekt erzeugt, so wird diesem durch den Konstruktor schon etwas in die Wiege gelegt. Man kann also schon vor der eigentlichen Verwendung etwas festlegen. Das klassische Beispiel wäre eine MySQL-Klasse.


class MySQL
{
  private $db;
  public function __construct ($host$user$password)
  {
    $this -> db mysql_connect ($host$user$password);
  }
}
$mysql = new MySQL ($host$user$password);

So würde schon bei der Erzeugung des Objektes "MySQL" automatisch eine Verbindung zum Datenbankserver aufgebaut.

3. Destruktor

Dies ist die "zerstören"- bzw. "TÖÖÖÖTEN"-Methode. Sobald alle Verweise auf ein Objekt entfernt wurden, wird Selbiges automatisch "geplättet", das heißt vernichtet. Sollte also zum Beispiel keine Referenz mehr auf die Verbindung zu einer Datenbank verweisen, so wird diese getrennt.


public function __destruct ()
{
  mysql_close ($this -> db);
}

4. Rückgabewerte

Leider gibt es bei diesen Methoden keine. Wie kann man dann überprüfen, ob sie funktionieren? Da gibt es mehrere Möglichkeiten. Man könnte bei SQL-Abfragen eine die-Anweisung im Falle eines Fehlers einbauen. Möglich wäre auch eine try-catch-Anweisung, zu der ich später komme. Oder man betet einfach.

5. Konstruktormethoden in Eltern- oder Großelternklassen

Hier gibt es ein paar Feinheiten. Also, wenn eine Kindklasse keinen eigenen Konstruktor hat, so wird der der Elternklasse automatisch aufgerufen. Ansonsten muss er explizit aufgerufen werden. Das geschieht mit diesem Paijai Dingsbumms, also dem Doppel-Doppelpunkt und dem ebenfalls schon bekannten parent. Idealerweise sollte man das natürlich im Konstruktor der Kindklasse machen.


class Mutter extends Mensch
{
  public function __construct()
  {
    echo 'Mutter';
  }
}
class Rotzblag extends Mutter
{
  public function __construct()
  {
    parent::__construct();
  }
}
$blag = new Rotzblag();

Und was macht man, wenn die Elternklasse keinen Konstruktor hat, die Großelternklasse aber schon? Auch das habe ich euch ja schon gezeigt. Ach ja, das Prinzip ist beim Destruktor dasselbe.


class Mensch 
{
  public function __construct()
  {
    echo 'Mensch';
  }
}  
class Mutter extends Mensch { ... }
class Rotzblag extends Mutter
{
  public function __construct()
  {
    Mensch::__construct();
  }
}

6. Sichtbarkeitsstufen

Wenn man bei beiden Methoden eine andere Sichtbarkeit als public nimmt, so kann man anschließend kein Objekt daraus erzeugen. Der folgende Code führt also zu einem Fehler.


class Frau 
{
  private function __construct() { ... }
}  
$doerte = new Frau;

Bei abgeleiteten Klassen ist es dagegen ohne weiteres möglich.


class Mensch 
{
  private function __construct() {}
  private function __destruct() {}
}
class Mann extends Mensch
{
  public function __construct() {}
  public function __destruct() {}
}
$dieter = new Mann;

Aber!!!

Eigentlich ist das ziemlicher Tinnef. Denn in einem Konstruktor/Destruktor wird ja etwas gemacht, sonst bräuchte man ihn nicht. Und da gibt es eine Feinheit. Wenn man die in der Elterklasse auf protected setzt und in der Kindklasse keine eigenen Konstruktor/Destruktor hat, so passiert das. Man erzeugt aus der Kindklasse ein Objekt. Dabei wird dann automatisch der Konstruktor/Destruktor der Elternklasse vom Objekt aufgerufen. Und dann knallt es wegen der Sichtbarkeitsstufe. Deshalb müssen die explizit aufgerufen werden.


class Mensch 
{
  protected function __construct() {}
  protected function __destruct() {}
}
class Mann extends Mensch
{
  public function __construct() {  
    parent::__construct();
  }
  public function __destruct() {  
    parent::__destruct();
  }
}
$dieter = new Mann;

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt