Private Methoden (Thema: PHP Beispiele)

Sinn und Definition von privaten Methoden in PHP

1. Einleitung

Als private Methoden werden all jene Methoden einer Klasse bezeichnet, die nicht von Objekten anderer Klassen aufgerufen werden dürfen, sondern nur von Objekten der Klasse selbst. Es sind sozusagen „interne” Methoden. Sie werden gezielt als privat markiert, in der Regel da ihre Ausführung durch andere Objekte sinnlos oder sogar potentiell schädlich wäre. Objekte der selben Klasse dürfen auf private Methoden anderer Objekte der selben Klasse zugreifen. Das ist allerdings eher unüblich, typischerweise greifen Objekte nur auf ihre eigenen privaten Methoden zurück.

Die Markierung von Methoden als privat erfolgt, indem vor das „function” der Methode „privat” geschrieben wird. Ein eventuelles „public” oder „protected” fällt dadurch weg.

PHP-Code: Grober Aufbau einer privaten Methode - fast identisch zu normalen Funktionen
private function doSomethingPrivate() {
	// ...
}

2. Beispiel 1: Auto-Klasse

Im ersten Beispiel wird eine Klasse „Auto” definiert, welche als „Schablone” für jedes im System abgespeicherte/generierte Auto dienen soll. Der Einfachheit halber hat sie als einziges Feld die Herstellerangabe, welche auch nur über den Konstruktor gesetzt werden kann. Sobald diese gesetzt werden soll, wird einmalig die private Methode pruefeHersteller() der selben Klasse aufgerufen. Diese Methode überprüft den Hersteller auf Gültigkeit (also ob er bekannt ist) und gibt gegebenenfalls false (=unbekannt) zurück.

PHP-Code: Eine private Methode zum Überprüfen der Gültigkeit von Automarken
<?php
	class Auto {
		private $hersteller;

		public function __construct($hersteller) {
			if ($this->pruefeHersteller($hersteller)) {
				$this->hersteller = $hersteller;
			} else {
				$this->hersteller = 'Ungueltiger Hersteller';
			}
		}

		public function getHersteller() {
			return $this->hersteller;
		}

		private function pruefeHersteller($hst) {
			if (!in_array($hst, array('BMW', 'VW', 'Toyota', 'Daimler', 'Audi', 'GM'))) {
				// Hier beispielhaft mit echo,
				// normalerweise sollte nur false zurueckgegeben werden.
				echo("Autos vom Hersteller $hst sind nicht erlaubt!");
				return false;
			}
			return true;
		}
	}
	
	$einAuto = new Auto('BMW');
	var_dump($einAuto->getHersteller());
	// Der nachfolgende Aufruf erzeugt einen Fatal Error, da die Methode als privat markiert wurde
	// und nicht von außen aufgerufen werden darf.
	$einAuto->pruefeHersteller('Opel');
?>

HTML-Code: Ausgabe
string(3) "BMW"
<br />
<b>Fatal error</b>:  Call to private method Auto::pruefeHersteller() from context '' in <b>...\test.php</b> on line <b>32</b><br />


3. Beispiel 2: Flugzeug-Klasse

Im nächsten Beispiel werden eine Klasse für Flugzeuge und eine für Schiffe definiert. Jedes Flugzeug hat einen Alarm der über die private Methode alarm() ausgelöst wird. Entsprechend kann hier ein Flugzeug den Alarm jedes anderen Flugzeugs aktivieren, da sie zur selben Klasse gehören. Ein Schiff jedoch darf das nicht. Zu Demonstrationszwecken wurde sowohl der Klasse Flugzeug als auch der Klasse Schiff jeweils eine Methode alarmAktivierenVon($flugzeug) hinzugefügt. Entsprechend des Namens versuchen diese, den Alarm des übergebenen Flugzeugs auszulösen. Die Flugzeug-Klasse hat Erfolg damit, beim Schiff jedoch gibt es einen Fatal Error.

PHP-Code: Eine private Methode zum Auslösen eines Flugzeugalarms
<?php
	class Flugzeug {
		/**
		 * Aktivieren des Alarmsystems
		 * Flugzeuge dürfen untereinander Alarmsysteme aktivieren,
		 * um den jeweils anderen zu warnen.
		 * Andere Fortbewegungsmittel dürfen das aber nicht, daher ist die
		 * Methode hier als privat markiert.
		 */
		private function alarm() {
			echo("Alarm!!!");
		}
		
		public function alarmAktivierenVon(Flugzeug $flugzeug) {
			// Zugriff auf private Methode eines anderen Objekts der selben Klasse
			$flugzeug->alarm();
		}
	}
	
	class Schiff {
		public function alarmAktivierenVon(Flugzeug $flugzeug) {
			// Zugriff auf private Methode eines anderen Objekts einer anderen Klasse
			// ergibt: Fatal Error
			$flugzeug->alarm();
		}
	}
	
	
	$flugzeug1 = new Flugzeug();
	$flugzeug2 = new Flugzeug();
	$schiff = new Schiff();
	
	// indirekter Zugriff auf private Methode
	$flugzeug2->alarmAktivierenVon($flugzeug1);
	
	// indirekter Zugriff auf private Methode einer anderen Klasse
	// daher Fatal Error
	$schiff->alarmAktivierenVon($flugzeug1);
?>

HTML-Code: Ausgabe
Alarm!!!<br />
<b>Fatal error</b>:  Call to private method Flugzeug::alarm() from context 'Schiff' in <b>...\test.php</b> on line <b>24</b><br />


Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen zu Cookies erhalten Sie in unserer Datenschutzerklärung. OK