Im Abschnitt Methoden – Funktionen einer Klasse hast du gelernt wie man mit einer Funktion, die innerhalb einer Klasse angelegt wird (sprich: Methode), jedem erzeugten Objekt einen Namen übergeben kann (mittels „setName“).
In diesem Teil geht es auch wieder um Methoden, diesmal um eine ganz spezielle, dem Konstruktor: __construct().
Der Konstruktur ist eine magische Methode. Magische Methoden sind in PHP vordefiniert und werden ausgeführt wenn eine bestimmte Aktion stattfindet. Die Construct-Methode wird automatisch aufgerufen sobald ein Objekt erzeugt wird, schauen wir uns das an unserer bisherigen Klasse Raumschiff_fabrik an:
<?php class Raumschiff_fabrik { public $geschwindigkeit = 5; public $schild = 3; public $leben = 10; public $name; public function setName($neuer_name) { $this->name = $neuer_name; } } $schiff1 = new Raumschiff_fabrik(); $schiff2 = new Raumschiff_fabrik(); ?>
In Zeile 16 und 17 wird jeweils ein Objekt erzeugt. Auch wenn man es hier nicht sieht, wird jedes mal wenn ein Objekt der Klasse „Raumschiff_fabrik“ erzeugt wird, die magische Methode „__construct()“ aufgerufen. Da wir aber bislang in der Konstruktor-Methode keine Anweisungen vergeben haben, können wir keinen Unterschied feststellen.
Wofür ist die Methode „__construct()“ gedacht?
Da der Konstruktor unmittelbar nach der Objekt-Initialisierung aufgerufen wird, eignet er sich hervorragend um Variablen Werte zuzuweisen. Bisher müssen wir, um unserem Raumschiff einen Namen zu geben, extra noch die Methode „setName()“ aufrufen. Dabei wäre es doch praktisch direkt beim erzeugen des Raumschiffs diesem einen Namen zuzuweisen:
<?php class Raumschiff_fabrik { public $geschwindigkeit = 5; public $schild = 3; public $leben = 10; public $name; function __construct($neuer_name) { $this->name = $neuer_name; } } $schiff1 = new Raumschiff_fabrik('Imhotep'); $schiff2 = new Raumschiff_fabrik('Isis'); echo $schiff1->name; echo '<br />'; echo $schiff2->name; ?>
Ausgabe
Imhotep Isis
Nun müssen wir nicht mehr extra die Methode „setName()“ aufrufen, sondern können einfach bei der Objektinitialisierung einen Wert an die magische Methode „__construct()“ übergeben:
new Raumschiff_fabrik('Imhotep');
Wenn kein Wert an __construct übergeben wird
Doch ein Problem besteht weiterhin. Was passiert, wenn kein Wert an den Konstruktor übergeben wird? Dann fliegen immernoch namenlose Raumschiffe durchs All. Das möchten wir natürlich verhindern und modifizieren dafür unseren Konstruktor:
<?php class Raumschiff_fabrik { public $geschwindigkeit = 5; public $schild = 3; public $leben = 10; public $name; function __construct($neuer_name = null) { if($neuer_name != null) $this->name = $neuer_name; else $this->name = 'Raumschiff-ID#'.rand(999, 99999); } } $schiff1 = new Raumschiff_fabrik(); $schiff2 = new Raumschiff_fabrik(); echo $schiff1->name; echo '<br />'; echo $schiff2->name; ?>
Ausgabe (bei jedem Aufruf anders):
Raumschiff-ID#54344 Raumschiff-ID#20370
Der modifizierte Konstruktor ist leicht erklärt: „$neuer_name = null“ sagt aus, wenn kein Wert an den Konstruktor vergeben wird (sprich, die Variable ist leer), soll der Eigenschaft „name“ eine zufällig ID übergeben werden. Ist $neuer_name nicht leer (sprich, es wurde ein Name für das Raumschiff übergeben), soll die Eigenschaft „name“ einfach diesen Wert erhalten.
Es kann noch vorkommen, dass zwei Raumschiffen die gleiche ID zugewiesen wird. Später werden wir unsere Klasse so modifizieren, dass jedes Raumschiff eine eindeutige ID hat.