Constructor – Objekt erzeugen und Variablen initialisieren

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.

hier geht's weiter...



Kommentare


Bei deinem Spiel Lazy Space Wars hast du einen Fehler, denn wenn der schaden unter 3 ist steigt das Leben des Schiffes. Zeile 19:

//berechen wieviel Schaden trotz des Schilds entsteht
$rest_schaden = $schaden – $this->schild;
$this->leben -= $rest_schaden;

Also falls '$schaden=1' dann wird '$rest_schaden=1-3' also kommt -2 als Ergebnis.
Dann wird 'leben -= -2' also 12

Grüße gix

Kommentar schreiben

Kommentar

Hilfe:

<strong>fettgedruckt</strong> => fettgedruckt

<em>kursiv</em> => kursiv

<a href="http://wordpress.lernenhoch2.de">Link</a> => Link

[code]<?php echo 'hello world'; ?>[/code]

*

Feedback Formular