Klassen und Objekte

Klassen und Objekte?

Bislang wurden einfach Datentypen wie bool/integer und string besprochen. Für komplexere Strukturen wurden arrays verwendet. Aber es wäre schön eigene Datentypen zu definieren.

Genau das bietet die objektorientierte Programmierung. Durch die definition eine Klasse ist es möglich einen Bauplan für ein Objekt zu erstellen.

 

Klassen

Wenn man das noch nie gehört hat, klingt es erstmal komisch. Das folgende Beispiel zeigt die Klasse einer Person:

<?php
class Person {
	/**
	* @var string $firstName;
	*/
	protected $firstName;

	/**
	* @var string $lastName;
	*/
	protected $lastName;

	/**
	* @param string $firstName
	*/
	public function setFirstName($theFirstName) {
		$this->firstName = $theFirstName;
	}

	/**
	* @return string
	*/
	public function getFirstName() {
		return $this->firstName;
	}
}
?>

Das ist erstmal eine Menge neuer Dinge. Fangen wir einfach an.


Das Schlüsselwort „class“ sagt. Hier beginnt die Definition einer Klasse. Eine Klasse ist nur der Bauplan für Objekt.


Die Variablen $firstName und $lastName sind Attribute der Klasse. Der Datentype Person besteht also aus den Eigenschaften „firstName“ und „lastName“.

Die Funktionen innerhalb einer Klasse bezeichnet man als Methoden. Eine Methode dient dazu Werte von einem Objekt zu lesen oder sie zu schreiben oder den Zustand des Objektes zu verändern.


Definierte Methoden und Attribute sind nicht global zu verwenden. Dadurch können zwei verschiedene Klassen die gleichen Attribut und Methodennamen haben ohne dass sie sich gegenseitig beinflussen. Das macht es einfach den Überblick zu behalten, da Attribute nur Gültigkeit innerhalb der Klasse habe.

Instanzen einer Klasse – Objekte erzeugen

Bislang wurde nur der Bauplan also die Klasse erstellt. Die Klasse wurde jedoch noch nicht verwendet. Speichere den Inhalt der oberen Klasse in der Datei „Person.php“ ab und erstelle auf der selben Ebene eine Datei „index.php“ mit folgendem Inhalt:

<?php
	require_once 'Person.php';

	$firstPerson = new Person();
	$firstPerson->setFirstName('Peter');

	$secondPerson = new Person();
	$secondPerson->setFirstName('Paul')

	echo $firstPerson->getFirstName();
	echo $secondPerson->getFirstName();
?>

Im oberen Beispiel ist zu sehen, wie zwei Insanzen der Klasse Person erstellt werden. Zum erstellen eines Objekte wird folgende Syntax verwendet.

$<variablenName> = new <Klassenname>();

Methoden eines Objektes

Nachdem die zwei Instanzen erzeugt wurden, erfolgte für beide der Aufruf der Methode „setFirstName“ jedoch mit unterschiedlichen Werten. Es existieren dann also zwei Personen Objekte. Das erste hat den Vornamen „Peter“ und das zweite hat den Vornamen „Paul“.

In den letzten beiden Zeilen wird die Methode „getFirstName()“ verwendet um den Vornamen auszugeben. Der Aufbau eines Methodenaufrufes ist also wie folgt:

$ergebnis = $objekt->methodenName(<Methodenparameter>);

Die Parameter eine Methode bezeichnet man als Signatur oder Methodensignatur.

Wie bei normalen PHP Funktionen befinden sich am Beginn der Methodensignatur die erforderlichen Paramter und am Ende die optionalen Parameter.


Beispiel:

….
	public setAddress ($street,$streetNr, $city, $country='Germany') {
		$this->street = $street;
		$this->streetNr = $streetNr;
		$this->citry = $city;
		$this->country = $country;
	}
….

Im oberen Beispiel ist die Angabe des Landes optional, als Standardwert wird „Germany“ verwendet.

Anmerkung: Das obige Beispiel dient nur zur Demonstration. Man hätte für die Adresse auch ein eigenes Address Objekt einführen können.


Wenn man in der Methode selbst ein Objekt übergeben möchte, dann kann man den erwarteten Typen in der Signatur angeben. Sollte bei der Ausführung ein anderes Objekt übergeben werden führt dies zu einem Fehler. Dadurch kann sichergestellt werden. Das der übergebene Wert von einem bestimmten Typ ist. Für das vorherige Adressenbespiel würde die Methode dann so aussehen:

...
	public setAddress(Address $customerAddress) {
		$this->address = $customerAddress;
	}
…

Die Variable $this

In der ersten Beispiel Klasse (Person) wurde in der Methode setFirstName und getFirstName jeweils die Variable $this verwendet.

Diese Variable ist eine spezielle Variable, die für die aktuelle Instanz der Objektes steht.

public function setFirstName($theFirstName) {
	$this->firstName = $theFirstName;
}

In der vorherigen Methode wird "$this->firstName" verwendet, um in der aktuellen Instanz des Objekte dem Attribut „firstName“ den Wert der übergebenen Variable "$theFirstName" zuzuweisen.

Konstruktor und Destruktor

Ein Objekt ist wie eine simulation eines realen Gegenstandes. Eine Person hat immer einen Vornamen und einen Nachname. Es gibt also keine Person ohne Vor- und Nachnamen.

Einen solchen Anspruch an ein Objekt bezeichnet man als „Invariante“. Es ist machmal nützlich, dass ein Objekt nur erstellt werden kann, wenn man die erforderlichen Parameter übergibt.

Ausserdem ist kann es sinnvoll sein. Beim erzeugen eines Objekte etwas ganz bestimmtes zu tun.

Zu diesem Zweck gibt des den Kontruktor. Der Konstruktur wird aufgerufen, wenn das Objekt erzeugt wird. Die Argument/Parameter des Konstruktors werden bei erstellen des Objektes übergeben.

Beispiel:

$friend = new Person('Peter','Müller);

In diesem Beispiel wird ein Person Objekt immer mit dem Parameter <Vorname> und <Nachname> erzeugt. Es ist nicht mehr möglich ein Objekt ohne diese Parameter zu erzeugen.


Damit die Übergabe der Werte im Konstruktor funktioniert. Muss dieser Konstruktor in der Klasse eingefügt werden. Ein Konstruktor hat in PHP den festgelegten Methodenname __construct().

<?php
class Person {
	/**
	* @var string $firstName;
	*/
	protected $firstName;

	/**
	* @var string $lastName;
	*/
	protected $lastName;

	/**
	* @param string $firstName
	* @param string $lastName
	*/
	public function __construct($firstName, $lastName) {
		$this->firstName = $firstName;
		$this->lastName = $lastName;
	}
	...

}
?>

Ein paar Regeln

Es gibt ein paar Konvetionen im Umgang mit Objekten, die anderen Entwicklern das Leben leichter machen, wenn sie deinen Code lesen:

  1. Methoden zum setzen eines Wertes beginnen mit „set“

  2. Methoden zum lesen eines Wertes beginnen mit „get“

  3. Klassennamen beginnen immer mit einem großen Buchstaben.

  4. Instanzen, also Variablen, die Objekte enthalten beginnen immer mit einem kleinen Buchstaben (wie alle anderen Variablen auch)

  5. Attribute sind immer am Beginn der Klassendefinition.

  6. Der Konstruktur ist die erste Methode der Klasse

  7. Methoden folgen am Ende der Klassendefinition

Navigation