Methoden – Funktionen einer Klasse

Bislang hast du gelernt eine Klasse mit Eigenschaften zu erstellen. Als nächstes behandeln wir Methoden. Methoden sind Funktionen, die innerhalb einer Klasse verwendet werden (sprich: von aussen kann man nicht darauf zugreifen, nur über ein Objekt können diese Funktionen aufgerufen werden).

Die Klasse „Raumschiff_fabrik“ erweitern

Wir werden nun unsere Klasse „Raumschiff_fabrik“ aus dem vorigen Teil erweitern mit einer Methode um unseren Raumschiff-Objekten eindeutige Namen zu vergeben:

<?php

class Raumschiff_fabrik
{
	public $geschwindigkeit = 5;
	public $schild = 1;
	public $name;
	
	public function setName($neuer_name) {
		$this->name = $neuer_name;
	}
}
?>

Als erstes siehst du eine ganz normale Funktion mit dem Schlüsselwort „public“:

public function setName($neuer_name)

Hier sollte nichts neues für dich dabei sein, falls du nicht weißt was dieser Code macht, schau dir nochmal das Kapitel über PHP Funktionen an. Das Schlüsselwort public wird wie bei den Eigenschaften einer Klasse immer vor die Methode gesetzt. Wir gehen darauf später noch genauer ein.

Der nächste Teil sollte aber neu für dich sein:

$this->name = $neuer_name;

Hier wird der Eigenschaft „name“ der Wert der Variablen „$neuer_name“ übergeben. Was aber bedeutet „$this“?

$this – Erklärung

Wenn wir innerhalb einer Klasse einer Eigenschaft einen Wert übergeben wollen, können wir dafür nicht einfach den Namen der Eigenschaft nehmen, folgendes funktioniert also nicht:

public function setName($neuer_name) {
	$name = $neuer_name; //dies funktioniert nicht!
}

Wir können nur die Eigenschaften eines Objekts verändern da eine Klasse selbst keine Eigenschaften hat, sondern sie nur an die Objekte weitergibt. Mittels $this sagen wir daher: „Ändere die Eigenschaft des gerade aktiven Objekts“. Dazu ein Beispiel:

<?php

class Raumschiff_fabrik
{
	public $geschwindigkeit = 5;
	public $schild = 1;
	public $name;
	
	public function setName($neuer_name) {
		$this->name = $neuer_name;
	}
}

$schiff_1 = new Raumschiff_fabrik();
$schiff_2 = new Raumschiff_fabrik();

$schiff_1->setName('Anubis'); //dieses Objekt ist gerade aktiv und nur seine Eigenschaft "name" wird verändert

?>

Daher: immer wenn du in der Methode einer Klasse den Wert einer Eigenschaft verändern möchtest, musst du dies mittels $this machen. (Wenn dir diese Erklärung zum Verständnis nicht ausreicht, bitte hinterlasse einen Kommentar damit ich es vereinfachen kann).

Als nächstes erzeugen wir zwei neue Raumschiffe (Objekte) und geben jeden von ihnen einen eindeutigen Namen:

<?php

class Raumschiff_fabrik
{
	public $geschwindigkeit = 5;
	public $schild = 1;
	public $name;
	
	public function setName($neuer_name) {
		$this->name = $neuer_name;
	}
}

$schiff_1 = new Raumschiff_fabrik();
$schiff_2 = new Raumschiff_fabrik();

print_r($schiff_1);
print_r($schiff_2);

$schiff_1->setName('Anubis');
$schiff_2->setName('Cherti');

print_r($schiff_1);
print_r($schiff_2);

?>

Als Ausgabe erhalten wir:

Raumschiff_fabrik Object ( [geschwindigkeit] => 5 [schild] => 1 [name] => ) 
Raumschiff_fabrik Object ( [geschwindigkeit] => 5 [schild] => 1 [name] => )

Raumschiff_fabrik Object ( [geschwindigkeit] => 5 [schild] => 1 [name] => Anubis ) 
Raumschiff_fabrik Object ( [geschwindigkeit] => 5 [schild] => 1 [name] => Cherti )

Houston, we have a problem!

So, unsere Raumschifffabrik spuckt nun beliebig viele Schiffe aus, die Schiffe können sich mit ihrem Antrieb bewegen und kleinere Asteroiden verpuffen an unserem Schutzschild. Doch was ist mit größeren Asteroiden? Diese durchdringen unseren Schild und beschädigen das Schiff, deshalb brauchen wir jetzt noch:

  • eine Eigenschaft „leben“ (steht für die Hülle des Schiffs, wenn Leben den Wert „0“ erreicht, gilt die Hülle als durchschlagen und unser armes Raumschiff explodiert) und
  • eine Methode „treffer“ (berechnet den Schaden der durch den Asteroiden entstanden ist, reduziert die Eigenschaft „leben“ entsprechend und prüft ob das Raumschiff zerstört wurde
<?php

class Raumschiff_fabrik
{
	public $geschwindigkeit = 5;
	public $schild = 3;
	public $leben = 10;
	
	public $name;
	
	public function setName($neuer_name) {
		$this->name = $neuer_name;
	}
	
	public function treffer($schaden) {
		//prüfe ob der Asteroid unser Schutzschild durchschlagen hat 
		if($this->schild < $schaden)
		{
			//berechne wieviel Schaden trotz des Schilds entsteht
			$rest_schaden = $schaden - $this->schild;
			$this->leben -= $rest_schaden;
			
			if($this->leben <= 0)
			{
				echo 'Raumschiff "'.$this->name.'" wurde zerstört';
			}
		}
	}
}

?>

Erklärung:

  • Eigenschaft „leben“: Unsere Raumschiffe starten mit einer Hülle der Stärke 10
  • public function treffer($schaden): In dieser Funktion passieren mehrere Dinge:
    • als erstes wird geprüft, ob der Asteroid überhaupt den Schild durchschlägt: if($this->schild < $schaden)
    • Danach berechnen wir wieviel Schaden der Asteroid am Raumschiff verursacht. Als Beispiel: der Asteroid hat die Stärke 5, davon ziehen wir unser Schutzschild ab (3) und erhalten einen erzeugten Schaden von 2
    • der erzeugte Schaden ($rest_schaden) wird von unserem Leben abgezogen
    • Als letztes prüfen wir ob unser Raumschiff die Kollision überstanden hat. Wenn nein explodiert es und wir erhalten die Meldung das unser Raumschiff zerstört wurde :(

Die Theorie ist ja ganz interessant, aber nun wollen wir doch mal unsere Raumschifffabrik in einem kleinen Pseudo-Spiel testen: Lazy Space Wars I

Wenn du direkt mit der Theorie weitermachen möchtest, folge diesem Link: Constructor – Objekt erzeugen und Variablen initialisieren

hier geht's weiter...



Kommentare


Könntest du bei deinen Erläuterungen zum Thema $this noch kurz erwähnen, weshalb eine Klasse keine Eigenschaften haben kann? Falls das nicht zu weit ausholt und vom eigentlichen ablenkt, wäre es bestimmt eine Abrundung der ohnehin gut verständlichen Erklärungen.

Grüße,
Florian


Hab mal versucht ein eigenes kleines Pseudospiel zu machen. Allerdings wollte ich, dass unter bestimmten Bedingungen keine Energie abgezogen wird. Es zieht aber niemals Energie ab. Sieht bei mir so aus:


public $energie = 25;
public $vork = false;

public function vork()
{
$this->vork = true;
}
public function hit($schaden)
{
if($this->vork = true)
{

$this->vork = false;
}
else {
$this->energie = ($this->energie – $schaden);

}
}

if($player1->energie > 0)
{
$wurf = rand(1, 10);

if($wurf == 4)
{
$player1->vork;
echo …

btw, danke für das Tutorial, bitte mach weiter, da fehlen noch ein paar Kapitel! ;)


Du nutzt bei deinen if-Bedingungen das einfache Gleichheitszeichen. Wenn du zwei Werte miteinander vergleichen möchtest, musst du das doppelte Gleichheitszeichen verwenden.


und ich hab noch ne frage. kann ich irgendwo sehen was genau bearbeitet und berechnet wird? denn ich finde immer wieder leine fehler im code, die im "spiel" aber nicht auffallen.

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