In der objektorientierten Programmierung mit PHP spielt die Kapselung gegenüber unbefugten Zugriffen
eine wesentliche Rolle, da auf die innerhalb einer Klasse definierten Eigenschaften und Methoden nur dann ein Zugriff von
außerhalb erfolgen kann, wenn diese Eigenschaften und Methoden mit public deklariert wurden. Um die Sichtbarkeit bei der
Deklaration[1] festzulegen, stehen die Schlüsselwörter public,
protected und private zur Verfügung. Wurde bei der Deklaration von Methoden kein Schlüsselwort verwendet, so wird die
Sichtbarkeit automatisch von PHP auf public gesetzt.
Durch diese Kapselung ist die objektorientierte Programmierung gut für die Einrichtung von sicheren Schnittstellen geeignet, da
der Programmierer festlegen kann, über welche Instanzen ein Zugriff auf welche Klassen, Eigenschaften und Methoden ermöglicht
wird. Praktisch verfügt dabei jedes Objekt als Instanz einer Klasse über eine Schnittstelle, deren Beschreibung innerhalb der
jeweiligen Klasse oder in einer vererbenden Klasse erfolgt.
Um die Sichtbarkeit von Eigenschaften oder Methoden festzulegen, stehen, wie bereits erwähnt, drei Schlüsselwörter mit
folgender Bedeutung zur Verfügung:
public - Auf Eigenschaften und Methoden, die mit dem Schlüsselwort public deklariert wurden, kann von
überall im Script ein Zugriff über ein instanziiertes Objekt erfolgen.
protected - Auf Eigenschaften und Methoden, die mit dem Schlüsselwort protected deklariert wurden,
kann hingegen nur von der vererbenden Elternklasse und den erbenden Kinderklassen aus ein Zugriff auf diese Eigenschaften und
Methoden erfolgen.
private - Auf private Eigenschaften und Methoden kann hingegen nur aus der Klasse ein Zugriff
erfolgen, in denen diese deklariert und definiert wurden.
Nachfolgen zwei Beispiele, von denen das erste Beispiel fehlerhaft ist.
Erstes Beispiel für die Sichtbarkeit von E. und M. (klasse-03.php):
<?php class Saeuger { public $unterkla = "Höhere Säugetiere"; public $ordnung = "Primaten"; private $unterord = "Trockennasenaffen"; protected $spezies = "Mensch"; } /*-- Erzeugen und Instanziieren des Objektes Saeuger ----*/ $ausgabe = new Saeuger(); /*-- Felfer beim Zugriff auf die Eigenschaften ----------*/ echo "Der ".$this->spezies." gehört im Tierreich ". "zur Unterordnung der ".$this->unterord.".\n"; ?>
Der Zugriff von außen (von außerhalb der Klasse) auf die mit private oder protected deklarierten Variablen $unterord und $spezies mit $ausgabe-> würde einen Fehler auslösen und folgende Ausgabe bewirken:
Fatal error: Cannot access protected property Saeuger...
Das zweite Beispiel ist hingegen voll funktionsfähig, da hier der Zugriff auf die mit private und
protected geschützten Eigenschaften über die öffentliche (plubic) Methode getTR() innerhalb der Klasse erfolgt.
Zweites Beispiel für die Sichtbarkeit von E. und M. (klasse-04.php):
<?php class Saeuger { public $unterkla = "Höhere Säugetiere"; public $ordnung = "Primaten"; private $unterord = "Trockennasenaffen"; protected $spezies = "Mensch"; public function getTierReich() { $art = "Der ".$this->spezies." gehört im Tierreich ". "zur Unterordnung der ".$this->unterord.".\n"; return $art; } } /*-- Erzeugen und Instanziieren des Objektes Saeuger ----*/ $ausgabe = new Saeuger(); /*-- Zugriff auf die Methode getTierReich ---------------*/ echo htmlspecialchars($ausgabe->getTierReich()); ?>
Ausgabe von klasse-04.php:
Der Mensch gehört im Tierreich zur Unterordnung der Trockennasenaffen.
Bei der Sichtbarkeit von Eigenschaften und Methoden muss berücksichtigt werden, dass diese Sichtbarkeiten
vererbbar sind.
Wenn unterschiedliche Objekte in Beziehung zueinander stehen, wie beim Objekt Mensch, der auf Grund
seiner Abstammung im verwandtschaftlichen Verhältnis zum Objekt Tierreich steht, kann es durchaus sinnvoll sein, auch die
entsprechenden Klassen durch Vererbung von Eigenschaften und Methoden dem verwandtschaftlichen Verhältnis entsprechend zu
benutzen. Ermöglich wird diese Vererbung durch das Schlüsselwort extends. Zu Vererbung zwei Beispiele.
Im ersten Beispiel vererbt die Elternklasse der Säuger die mit protected deklarierten Eigenschaften an die Kinderklasse Mensch.
Über das Objekt Mensch() kann auf die öffentliche Methode getArt zugegriffen werden und durch die Vererbung der Eigenschaften
wird es wiederum ermöglicht, dass die Methode getArt auf die von der Elternklasse Saeuger geerbten Eigenschaften zugreifen
kann.
Erstes Beispiel für die Vererbung von E. und M. (klasse-05.php):
<?php /*-- Definition der Klasse Saeuger ----------------------*/ class Saeuger { protected $unterord = "Trockennasenaffen"; protected $familie = "Menschenaffen"; } /*-- Die Klasse Mensch erbt von der Klasse Saeuger ------*/ class Mensch extends Saeuger { private $spezies = "Mensch"; public function getArt() { $art = "Der ".$this->spezies." gehört im Tierreich ". "zur Unterordnung der ".$this->unterord." und ". "zur Familie der ".$this->familie.".\n"; return $art; } } /*-- Instanziieren des Objektes Mensch und Ausgabe ------*/ $ausgabe = new Mensch(); echo htmlspecialchars($ausgabe->getArt()); ?>
Im zweiten Beispiel vererbt die Elternklasse Saeuger die öffentliche Methode getErbe an die
Kinderklasse Mensch, wodurch ein Zugriff über das Objekt Mensch ermöglicht wird.
Zweites Beispiel für die Vererbung von E. und M. (klasse-06.php):
<?php /*-- Definition der Klasse Saeuger ----------------------*/ class Saeuger { public function getErbe() { return $this->getArt(); } } /*-- Die Klasse Mensch erbt von der Klasse Saeuger ------*/ class Mensch extends Saeuger { private $unterord = "Trockennasenaffen"; private $familie = "Menschenaffen"; private $spezies = "Mensch"; protected function getArt() { $art = "Der ".$this->spezies." gehört im Tierreich ". "zur Unterordnung der ".$this->unterord." und ". "zur Familie der ".$this->familie.".\n"; return $art; } } /*-- Instanziieren des Objektes Mensch und Ausgabe ------*/ $ausgabe = new Mensch(); echo htmlspecialchars($ausgabe->getErbe()); ?>
Die Ausgabe von beiden Beispielen enthält den folgenden Text:
Der Mensch gehört im Tierreich zur Unterordnung der Trockennasenaffen und zur Familie der Menschenaffen.
Bei der Vererbung muss die Reihenfolge der Klassen beachtet werden, dazu auf der nächsten Seite mehr.
zu 1: Deklaration oder Definition? Eine Variable gilt als deklariert, wenn sie im System durch Benennung eines Bezeichners bekannt gemacht wurde, wobei der Datentyp festgelegt und ein Speicherplatz reserviert wird und als definiert, wenn der Variablen ein Wert zugewiesen wurde, der im reservierten Speicherplatz abgelegt wird. Wer von links nach rechts schreibt, vergibt eines der Schlüsselwörter bereits bei der Deklaration, noch bevor diese definiert wird. Praktisch gibt es jedoch keine Unterschiede, da jede initialisierte Variable als deklariert und definiert gilt, außer einer Variablen wurde kein Wert zugewiesen, womit diese Variable undefiniert wäre.
Einführung « / » Vererbung
Einstieg in PHP
Übersicht
Diverse Themen