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.