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