6.2.4 Sichtbarkeit

Wenn public angegeben wird, dann kann das Hauptprogramm und jede andere Klasse auf die public-Eigenschaft und die public-Methode zugreifen. Dies ist nicht immer erwünscht. Daher gibt es die weiteren Sichtbarkeiten private und protected.

  • public (+) Zugriff erlaubt aus Hauptprogramm und aus anderen Klassen.
  • private (-) Zugriff nur aus derselben Klasse erlaubt, in der sich die Eigenschaft oder Methode befindet.
  • protected (#) Zugriff nur aus derselben Klasse und aus vererbten Klassen.

Die Zeichen in den Klammern geben an, wie die Sichtbarkeit in einem Klassendiagramm dargestellt wird.

Hier unser schon bekanntes Beispiel:

<?php declare(strict_types=1);

// Klasse
class Student
{
    // Eigenschaften der Klasse festlegen
    public $phoneNumber = "0815";

    // Methoden der Klasse festlegen
    public function setPhoneNumber(string $newPhoneNumber): void
    {
        $this->phoneNumber = $newPhoneNumber;
        echo "Sollte die TelNr. geändert werden? "
            . "Die neue Nummer lautet nun $this->phoneNumber <br>";
    }

    public function getPhoneNumber(): string
    {
        return $this->phoneNumber;
    }
}

// Hauptprogramm - zwei Objekte erstellen
$ute = new Student;

echo "1. In der Eigenschaft gespeicherte TelNr. auslesen <br>";
echo $ute->phoneNumber . "<br>";

echo "2. TelNr. in der Eigenschaft direkt ändern und auslesen <br>";
$ute->phoneNumber = 012345;
echo $ute->phoneNumber . "<br>";

Ausgabe:
1. In der Eigenschaft gespeicherte TelNr. auslesen
0815
2. TelNr. in der Eigenschaft direkt ändern und auslesen
5349

In Zeile 27 greifen wir direkt auf die Telefonnummer zu, die in der Eigenschaft $phoneNumber in Zeile 7 gespeichert ist und geben diese aus. Der direkte Zugriff über $ute->phoneNumber ist sehr einfach und bequem.

In Zeile 30 weisen wir der Eigenschaft $phoneNumber eine neue Telefonnummer zu, die wir in Zeile 31 wieder auslesen. Achtung: wir hatten in Zeile 7 einen String gespeichert und nun wird in Zeile 30 ein Integer übergeben. Dies ist hier ein Problem, da der Integer mit "0" anfängt und daher als Oktalzahl interpretiert wird. Übergeben wurde 012345 und gespeichert wurde 5349!

Um das oben gezeigte Problem zu vermeiden und um weitere Möglichkeiten zu bieten (dazu später mehr), kann man mit private oder protected den direkten Zugriff aus dem Hauptprogramm ($ute->phoneNumber) verbieten.

<?php declare(strict_types=1);

// Klasse
class Student
{
    // Eigenschaften der Klasse festlegen
    private $phoneNumber = "0815";

    // Methoden der Klasse festlegen
    public function setPhoneNumber(string $newPhoneNumber): void
    {
        $this->phoneNumber = $newPhoneNumber;
        echo "Sollte die TelNr. geändert werden? "
            . "Die neue Nummer lautet nun $this->phoneNumber <br>";
    }

    public function getPhoneNumber(): string
    {
        return $this->phoneNumber;
    }
}

// Hauptprogramm - zwei Objekte erstellen
$ute = new Student;

echo "1. TelNr. über die Methode setPhoneNumber() ändern <br>";
$ute->setPhoneNumber("012345");

echo "2. TelNr. über die Methode getPhoneNumber() auslesen <br>";
echo $ute->getPhoneNumber();

Ausgabe:
1. TelNr. über die Methode setPhoneNumber() ändern
Sollte die TelNr. geändert werden? Die neue Nummer lautet nun 012345
2. TelNr. über die Methode getPhoneNumber() auslesen
012345

In Zeile 30 wird über die Methode getPhoneNumber() die Eigenschaft ausgelesen.

Hinweis

In einer professionellen Programmierung würde natürlich kein "echo" in so einer Methode stehen, sondern es würde vielleicht eine andere Methode aufgerufen.

Wichtig

Wenn die Eigenschaften private sind, dann können diese Eigenschaften nur über Methoden gesetzt (setter) und gelesen (getter) werden. Ein direkter Aufruf über $ute->phoneNumber führt zu einer Fehlermeldung.

Anders herum gilt auch: wenn man mit Settern und Gettern arbeitet, dann sollten die Eigenschaften private sein.