Vererbung

Vererbung

Ein mächtiges Konzept der Objektorientierung ist die Vererbung. Mit Vererbung können Attribute und Methoden einer anderen Klasse gerbt werden.

Beispiel:


Bislang haben wir die Klasse Person erstellt. Es ist denkbar, dass wir in einer Software nicht nur mit Personen arbeiten wollen sondern auch mit Objekten, die alle Eigenschaften einer Person haben, aber noch einige mehr.

In diesem Beispiel implementieren wir die Klasse „Customer“(Kunde). Ein Kunde hat immer die Eigenschaften einer Person, also auch einen Vornamen und einen Nachnamen. Ein Kunde besitzt aber auch Eigenschaften die eine Person nicht hat, wie zum Beispiel eine Kundennummer.

Man kann also sagen: Jeder Kunde ist eine Person, aber nicht jede Person ist immer ein Kunde.

<?php
class Customer extends Person{
	/**
	* @var integer $customerId
	*/
	protected $customerId;

	/**
	* Creates an customer object.
	*
	* @param string $theFirstName
	* @param string $theLastName
	* @param integer $theCustomerId
	*/
	public function __construct($theFirstName,$theLastName,$theCustomerId) {
		$this->firstName = $theFirstName;
		$this->lastName = $theLastName;
		$this->customerId = $theCustomerId;
	}

	/**
	* @return integer
	*/
	public function getCustomerId() {
		return $this->customerId;
	}
}
?>

Die Klasse Customer ist die spezieller Klasse und Person die allgemeiner Klasse. Eine Verberung ist also immer auch eine Speziallisierung.

Das Beispiel im Detail

Das Schlüsselwort „extends“ dient dazu eine Klasse von einer anderen erben zu lassen.

Im Konstruktor (__construct()) werden auch die Attribute „firstName“ und „lastName“ zugewiesen, obwohl diese nicht in der Klasse „Customer“ definiert sind. Das funktioniert, weil diese Attribute verwerbt werden.

Das selbe gilt für Methoden. Methoden die es in der Basisklasse (Person) gibt, sind auch für CustomerObjekte verfügbar.

Instanceof

Manchmal ist es sinnvoll zu prüfen ob ein Objekt von einem bestimmten Typen oder dessen Basistyen ist. Dazu kann die Funktion „instanceof“ verwendet werden.

Beispiel:

<?php
	$personOne 	= new Person('Heinz', 'Müller');
	$personTwo 	= new Person('Peter', 'Pan');
	$customer	= new Customer('Wilhelm','Wommel',4711);

	if($personOne instanceof Person) { echo 'yes'; }
	if($personTwo instanceof Person) { echo 'yes' ;}
	if($personCustomer instanceof Person) { echo 'yes'; }
?>

Dieses Beispiel gibt dreimal „yes“ aus, da alle Personen sind. Wenn du zu prüfende Klasse im „instanceof“ Statement durch „Customer“ ersetzt wird nurnoch einmal „yes“ ausgegeben, da nur einer der drei ein Customer/Kunde ist.

Das Schlüsselwort parent

Wenn eine Klassen von einer anderen Klasse erbt, aber selbst eine Methode mit dem gleichen Namen besitzt, wird die Methode der erbenden Klasse ausgeführt. Es wird also immer die Methode der Klasse ausgeführt, die am speziellsten ist.


Beispiel:

<?php 
	class Person { 
		public function getSalutation(){ 
			return 'Hello'; 
		} 
	} 

	class Customer extends Person { 
		public function getSalutation() { 
			return 'Dear Customer'; 
		} 
	} 

		//the person will return „Hello“ 
	$personOne = new Person(); 
	echo $personOne->getSalutation(); 

		//the customer will return „Dear Customer“ 
	$customerOne = new Customer(); 
	echo $customerOne->getSalutation(); 
?>

Manchmal möchte man aber innerhalb einer erbenden Klasse eine Methode der Elternklasse aufrufen um einen Teil der Funktionalität zu verwenden.


Ein klassisches Beispiel ist der Aufruf des Basis Konstruktors. Hierbei kommt das Schlüsselwort parent ins Spiel:

<?php 
	class Person { 
		protected $firtName; 

		protected $lastName; 

		public function __construct($theFirstName, $theLastName) { 
			$this->firstName = $theFirstName; 
			$this->lastName = $theLastName; 
		} 

		public function getSalutation(){ 
			return 'Hello '.$this->firstName; 
		} 
	} 

	class Customer extends Person { 
		protected $customerNr; 

		public function __construct($theFirstName, $theLastName, $theCustrNr) { 
			parent::__construct($theFirstName, $theLastName); 
			$this->customerNr = $theCustrNr; 
		} 

		public function getSalutation() { 
			return 'Dear Customer '.$this->lastName.' '.$this->customerNr; 
		} 
	} 

	//the person will return „Hello“ 
	$personOne = new Person('Heinz','Müller'); 
	echo $personOne->getSalutation(); 

	//the customer will return „Dear Customer“ 
	$customerOne = new Customer('Werner','Meyer',3232); 
	echo $customerOne->getSalutation(); 
?>

Im oberen Beispiel, wird im Konstrutkor der erbenden Klasse der Konstruktor der Basisklasse ausgeführt. Danach wird die spezielle Eigenschaft Kundennummer im Kunden Objekt zugewiesen.

Ein paar Regeln

  1. Eine Klasse kann immer nur von einer anderen Erben. Das Erben von mehren Klassen ist nicht möglich. Aus diesem Grund sollte man sich überlegen ob man das sehr mächtige Konzept der Vererbung wirklich brauch. Machmal ist es auch sinnvoll statt der Vererbung, das vererbte Objekt als Attribut zu speichern.

  2. Wenn es eine Method in der erbenden Klasse gibt (in unserem Beispiel Customer), die es auch in der Basisklasse (Hier Person) gibt. Dann wird immer die Methode der erbenden Klasse ausgeführt.

  3. Vererbung ist über beliebig viele Ebenen möglich.

Navigation