Home
Navigation
Impressum
Coder Welten - Programmierung und Optimierung
Coder Welten
 
 

 

 

OOP: Sichtbarkeit von Eigenschaften und Methoden

Sichtbarkeit, Kapselung und Vererbung

Übersicht / Seite:

  1. Einführung (in die objektorientierte Programmierung)
  2. Sichtbarkeit (und Kapselung von Eigenschaften und Methoden)
  3. Vererbung (von Eigenschaften und Methoden sowie Autoload von Klassen)
  4. Konstruktoren und Destruktoren (Methoden zum Erzeugen und Auflösen)
  5. Beispiele (eine simple Parserklasse, eine TCP/IP Socket Klasse und mehr ...)

Sichtbarkeit und Kapselung

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üssel­wörter public, protected und private zur Verfügung. Wurde bei der Dekla­ration 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.

Vererbung von Eigenschaften und Methoden

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 verwandt­schaftlichen 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 ab­gelegt 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

 

Copyright © Verlag Horst Müller - Stendal - 2006 - Impressum - Datenschutz - Nutzungsbedingungen