Sichtbarkeit – Public, Private & Protected

In den vorigen Kapiteln habe ich immer wieder, wenn es um das Schlüsselwort „public“ ging, eine Erklärung aufgeschoben. An dieser Stelle erfolgt nun die Erklärung.

Public, protected & private – 3 Sichtbarkeiten für Eigenschaften und Methoden

In PHP gibt es 3 Sichtbarkeiten die eine Eigenschaft oder eine Methode in einer Klasse haben kann. Sichtbarkeiten sind dafür da festzulegen, an welcher Stelle im PHP Skript der Wert der Eigenschaft/Methode verändert oder aufgerufen werden kann.

(Beispiele folgen weiter unten)

  • public – eine Methode/Eigenschaft, die mit der Sichtbarkeit „public“ ausgestattet ist, kann überall im Skript über das Objekt aufgerufen werden. Alle bisherigen Beispiele wurden als „public“ deklariert.
  • private – als „private“ deklarierte Methoden/Eigenschaften können nur innerhalb dieser Klasse verändert werden. Auch geerbte Klassen können diese Eigenschaften/Methoden nicht aufrufen oder verändern
  • protected – „protected“ funktioniert genauso wie „private“ mit einem entscheidenden Unterschied: vererbte Klassen können diese Methoden/Eigenschaften aufrufen und/oder verändern

Public

<?php

class Elternklasse
{
	public $public_wert = 'Hallo, ich bin PUBLIC';
	
	public function ausgabe() {
		echo $this->public_wert;
	}
}

$obj1 = new Elternklasse;
echo $obj1->public_wert;
echo '<br />';
echo $obj1->ausgabe();

?>

Ausgabe

Hallo, ich bin PUBLIC
Hallo, ich bin PUBLIC

In diesem Beispiel lernst du noch nichts neues. Wir haben eine Eigenschaft und eine Methode, beide sind mit der Sichtbarkeit „public“ ausgestattet. Die Eigenschaft kann entweder direkt aufgerufen werden (Zeile 13) oder über die Methode „ausgabe“ (Zeile 15).

Protected

Nun verwenden wir zum ersten mal die Sichtbarkeit „protected“. Methoden und Eigenschaften die „protected“ sind, können in der Elternklasse und in der Kindklasse aufgerufen werden. Eigenschaften können allerdings nicht direkt über das Objekt aufgerufen werden:

<?php

class Elternklasse
{
	public $public_wert = 'Hallo, ich bin PUBLIC';
	protected $protected_wert = 'Hallo, ich bin PROTECTED';
	
	public function ausgabe() {
		echo $this->public_wert;
	}
}

class Kindklasse extends Elternklasse
{
}

$obj2 = new Kindklasse;
echo $obj2->public_wert;
echo '<br />';
echo $obj2->protected_wert; //diese Zeile erzeugt einen "fatal error"

?>

Ausgabe

Hallo, ich bin PUBLIC

Fatal error: Cannot access protected property Kindklasse::$protected_wert ...

Wir erhalten diese Fehlermeldung aus folgendem Grund: die Eigenschaft „protected_wert“ ist protected und darf daher nicht direkt über das Objekt aufgerufen werden (Zeile 20). Wir können aber über unsere Methode „ausgabe“ den Wert der Eigenschaft „protected_wert“ ausgeben:

<?php

class Elternklasse
{
	public $public_wert = 'Hallo, ich bin PUBLIC';
	protected $protected_wert = 'Hallo, ich bin PROTECTED';
	
	public function ausgabe() {
		echo $this->public_wert;
	}
}

class Kindklasse extends Elternklasse
{
	public function ausgabe() {
		echo $this->public_wert;
		echo '<br />';
		echo $this->protected_wert;
	}
}

$obj2 = new Kindklasse;
echo $obj2->ausgabe();

?>

erzeugt folgende Ausgabe:

Hallo, ich bin PUBLIC
Hallo, ich bin PROTECTED

Eine „geschützte“ Eigenschaft können wir dennoch ausgeben, solange wir dazu eine Methode innerhalb der Klasse verwenden.

Private

Die Sichtbarkeit „private“ ist noch eingrenzender als „protected“. Eigenschaften und Methoden, die in der Elternklasse mit private deklariert werden, werden nicht an die Unterklassen vererbt:

<?php

error_reporting(E_ALL);  //zeigt Warnungen & Fehler an

class Elternklasse
{
	private $private_wert = 'Hallo, ich bin PRIVATE';
	
	public function ausgabe() {
		echo $this->private_wert;
	}
}

class Kindklasse extends Elternklasse
{
	public function ausgabe() {
		echo $this->private_wert;
	}
}

$obj3 = new Elternklasse;
echo $obj3->private_wert; //fatal error
echo '<br />';
echo $obj3->ausgabe();

$obj4 = new Kindklasse;
echo $obj4->private_wert; //fatal error
echo '<br />';
echo $obj4->ausgabe();

?>

Zeile 22 und Zeile 27 erzeugen eine Fehlermeldung, da man, wie beim Schlüsselwort protected, „private“ Eigenschaften nicht direkt über das Objekt aufrufen kann. Läßt man diese beiden Zeilen weg, erhälst du folgende Ausgabe:

Hallo, ich bin PRIVATE

Notice: Undefined property: Kindklasse::$private_wert ...

Da „private“ Eigenschaften nicht an Kindklassen vererbt werden, können wir diesen Wert nicht mit dem „obj4“ ausgeben. Die „Notice“ sagt, dass die Kindklasse die Eigenschaft „private_wert“ nicht kennt (da sie auch nicht vererbt wurde).

Fazit

Public, Protected und Private sind die drei Sichtbarkeiten, die uns PHP zur Verfügung stellt um das Verhalten unserer Klassen und Objekte zu steuern. In den folgenden Teilen werden wir unsere Klassen auch entsprechend abändern und wo es Sinn macht die Schlüsselworte „protected“ und „private“ nutzen.

hier geht's weiter...



Kommentare


Die Sichtbarkeit “private” ist noch eingrenzender als “public”.
-> Ist zwar korrekt, du meintest aber wohl als "protected".


Danke für den Hinweis, habe es korrigiert! :)


"protected – “protected” funktioniert genauso wie “private” mit einem entscheidenden Unterschied: vererbte Klassen können diese Methoden/Eigenschaften aufrufen und/oder verändern"

Ich würde hier hinzufügen, dass nicht nur vererbte, sondern auch vererbende Klassen auf als "protected" deklarierte Methoden der erbenden Klasse zugreifen können.

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