# 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:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <?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.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <?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.