Das Schlüsselwort final

Wenn du möchtest, dass von einer Klasse nicht mehr geerbt werden darf, oder dass eine Methode nicht mehr überschrieben werden darf, so kann die Klasse oder die Methode als „final“ definiert werden. Wenn eine Klasse als „final“ definiert wurde, sind automatisch auch alle Methoden „final“ da man von der Klasse nicht mehr erben kann. Das „final“ einer Klasse ist also stärker.

In der täglichen Arbeit als Entwickler habe ich dies bislang äusserst selten benötigt, aber folgender Fall kann sinnvoll sein:

Ich möchte in einer Klasse ermöglichen das eine erbende Klasse eine Methode verwenden darf aber diese soll nicht verändert werden können. In diesem Fall könnte ich die Methode nicht als private deklarieren, da die erbende Klasse diese Methode nicht aufrufen könnte. Wenn ich sie als protected deklarieren würde, könnte die erbende Klasse sie zwar aufrufen, aber darüberhinaus auch überschreiben.

Das folgende Beispiel zeigt das Prinzip, es ist zugegebenermaßen etwas konstruiert, da man die Methode „getAge“ in der richtigen Implementierung wohl in die Basisklasse verschieben würde.

Wer ein bessere Beispiel findet bitte melden ;)

<?php
	class Person {
		/**
		* @dateTime
		*/
		private $birthDay;

		/**
		* @param DateTime $birthDay
		*/
		public function __construct(DateTime $birthDay) {
			$this->birthDay = $birthDay;
		}

		/**
		* @return int
		*/
		protected final function getAgeForCertainDate(DateTime $date) {
			$passedYear = (int) $date->format('Y'); 
			$birthYear = (int) $this->birthDay->format('Y');

			return $birthYear - $passedYear;
		}
	}

	class PoliceMen extends Person{
		/**
		* @return int
		*/
		public function getAge() {
			return $this->getAgeForCertainDate(new DateTime('now'));
		}
	}	

	$birthDate = new DateTime();
	$birthDate->setDate(1984,2,6);

	$peter 	   = new PoliceMen($birthDate);
	echo $peter->getAge();
?>

Ein weiterer Anwendungsfall sind „public“ Methoden, die nicht überschrieben werden sollen oder ganze Klassen als "final" zu deklarieren. Ich denke dieser Fall ist klar, da jeder Klasse mit "public" und "protected" Methoden beerbt werden kann und dies die einzige Möglichkeit ist es zu verhindern.


Navigation